给出n行m列的矩阵,“@”代表有石油,“*”代表没有,如果含有石油的小块相邻,那么属于同一块油田。相邻包括水平、垂直和斜对角,求油田的数量。
BFS代码
#include<stdio.h>
int m, n;
char grid[105][105];
int x[8] = {-1, -1, -1, 0, 1, 1, 1, 0};
int y[8] = {-1, 0, 1, 1, 1, 0, -1, -1};
struct node
{
int x, y;
}Q[10005];
void bfs(int a, int b)
{
int top = 0, i, j, tx, ty;
Q[top].x = a;
Q[top++].y = b;
grid[a][b] = '*';
for(i = 0; i < top; i ++)
{
for(j = 0; j < 8; j ++)
{
tx = Q[i].x + x[j];
ty = Q[i].y + y[j];
if(tx >= 0 && ty >= 0 && tx < m && ty < n && grid[tx][ty] == '@')
{
grid[tx][ty] = '*';
Q[top].x = tx;
Q[top++].y = ty;
}
}
}
}
int main(){
int i, j, cnt;
while(scanf("%d%d", &m, &n), m)
{
for(i = cnt = 0; i < m; i ++)
{
scanf("%s", grid[i]);
}
for(i = 0; i < m; i ++)
{
for(j = 0; j < n; j ++)
{
if(grid[i][j] == '@')
{
cnt++ ;
bfs(i, j);
}
}
}
printf("%d\n", cnt);
}
return 0;
}
DFS代码
#include<stdio.h>
int m, n;
char grid[105][105];
int x[8] = {-1, -1, -1, 0, 1, 1, 1, 0};
int y[8] = {-1, 0, 1, 1, 1, 0, -1, -1};
void dfs(int a, int b)
{
int i, tx, ty;
grid[a][b] = '*';
for(i = 0; i < 8; i ++)
{
tx = a + x[i];
ty = b + y[i];
if(tx >= 0 && ty >= 0 && tx < m && ty < n && grid[tx][ty] == '@')
{
dfs(tx, ty);
}
}
}
int main()
{
int i, j, cnt;
while(scanf("%d%d", &m, &n), m)
{
for(i = cnt = 0; i < m; i ++)
{
scanf("%s", grid[i]);
}
for(i = 0; i < m; i ++)
{
for(j = 0; j < n; j ++)
{
if(grid[i][j] == '@')
{
cnt++ ;
dfs(i, j);
}
}
}
printf("%d\n", cnt);
}
return 0;
}