1 1 * 3 5 *@*@* **@** *@*@* 1 8 @@****@* 5 5 ****@ *@@*@ *@**@ @@@*@ @@**@ 0 0
0 1 2 2
思路:果断bfs之,在以前写过的bfs代码上面稍作修改即可得到正确结果。
#include
#include
struct queuenode{ //建结构
int a, b;
}queue[100000];
int count, tx, ty, head = 0,tail = 0; //定义
int a, b, n, temp;
int dir[8][2] = { {1,0} , {0,1} , {-1,0} , {0,-1} , {1,1} , {-1,-1} , {1,-1} , {-1,1} };
bool map[110][110];
int m, k, i, j;
int inarea(int x,int y) //判断是否在区域内
{
return x >= 0 && y >= 0 && x < a && y < b;
}
void bfs( ) //bfs
{
count++;
tail = head;
queue[head].a = i; //初始化队列头部
queue[head].b = j;
map[i][j] = 1;
while(head <= tail){ //在队列中有数据的情况下进行循环
for(k = 0;k < 8; k++){ //八个方向了~!
tx = queue[head].a + dir[k][0];
ty = queue[head].b + dir[k][1];
if(inarea(tx, ty) && map[tx][ty]== 0){
tail++;
queue[tail].a = tx;
queue[tail].b = ty;
map[tx][ty] = 1;
}
}
head++;
}
return;
}
int main(void) //主函数
{
while(scanf("%d%d",&a,&b)==2&&a!=0){
memset(map, 1, sizeof(map));
while(scanf(" ")||scanf("\n")) ;
for(i = 0;i < a; i++){ //扫描地图
for(j = 0;j < b; j++){
scanf("%c",&temp);
if (temp == '*') map[i][j] = 1;
else if (temp == '@') map[i][j] = 0;
else {
j--;
continue;
}
}
}
count = 0; //初始化计数
for(i = 0;i < a;i ++){
for(j = 0;j < b;j ++){
if (map[i][j] == 0){ //从找到油田开始进入bfs
bfs();
}
}
}
printf("%d\n",count);
}
return 0;
}