uva 572 Oil Deposits(DFSエルゴード)


Oil Deposits 
The GeoSurvCorp geologic survey compmpany reponsible for detecting undedededededededededededededededededeposits. GeoSurvCompp works with onelargrectanglar region of ladatime,and creates a gridaaaadededededededededededededededededededestststststaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaar or not the plot contains oil.
A plot containing oil is caled a pocket.If two pockets are adjacent,then the y are parts of the same oil deposit.Oil deposits can be quite large and may conin numerous pockets.Your jois to determineroinent
Input 
The input file contains one or more grids.Each grid begins with a line containing 
m
 and 
n
the number of rows and columns in the grid,separated by a single space.If 
m
 = 0 it signals the end of the input;others wise 
 and 
Following this are 
m
 LINE of 
n
 characters each(not counting the end-off-line characters).Each character corecter cores ponds to one plot,and is ether`

'representing the absence of oil,or
@
'representing an oil pocket.
Output 
For each grid、output the number of distinct oil deposits.Two different pockets are parts of the same oil deposit if the y are horizontally、vertically、or diagonally.Anoil deposit witter nopockle
Sample Input 
1 1
*
3 5
*@*@*
**@**
*@*@*
1 8
@@****@*
5 5
****@
*@@*@
*@**@
@@@*@
@@**@
0 0
Sample Output 
0
1
2
2
油田を代表して、途中でどれぐらいの油田があるかを判断します.
問題解決の考え方:遍歴して、「@」に出会うと、その位置と隣にある「@」がすべて「*」になり、採集されたのと同じです.
#include
#include
#define N 105
char map[N][N];
int n, m, cnt;
const int dir[8][2] = {{-1, -1}, {-1, 0}, {-1, 1}, {0, -1}, {0, 1}, {1, -1}, {1, 0}, {1, 1}};
void DFS(int a, int b){

	map[a][b] = '*';
	for (int i = 0; i < 8; i++){
		if (a + dir[i][0] < 0 || a + dir[i][0] >= n)	continue;
		if (b + dir[i][1] < 0 || b + dir[i][1] >= m)	continue;
		if (map[a + dir[i][0]][b + dir[i][1]] == '*')	continue;
		DFS(a + dir[i][0], b + dir[i][1]);
	}
}

int main(){
	while (scanf("%d%d%*c", &n, &m), n && m){
		// Init.
		memset(map, 0, sizeof(map));
		cnt = 0;

		// Read.
		for (int i = 0; i < n; i++)
			gets(map[i]);

		// Handle.
		for (int i = 0; i < n; i ++){
			for (int j = 0; j < m; j++){
				if (map[i][j] == '@'){
					DFS(i, j);
					cnt++;
				}
			}
		}

		printf("%d
", cnt); } return 0;}