照着ppt抄写的
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
char mat[101][101];
bool vis[101][101];
int queHead, queTail;
int dx[] = { -1, -1, -1, 0, 0, 1, 1, 1 };
int dy[] = { -1, 0, 1, -1, 1, -1, 0, 1 };
class Node
{
public:
int x, y;
Node(){};
Node(int x, int y) :x(x), y(y){}
//判定当前位置是否在地图范围内
bool isInMap(int m, int n)
{
return x < m&&x >= 0 && y < n&&y >= 0;
}
}que[10000];
void bfs(int x, int y, int m, int n)
{
queHead = queTail = 0;//清空队列
que[queTail++] = Node(x, y);//将(x,y)加入队列
vis[x][y] = true;
for (; queHead < queTail;queHead++)
for (int i = 0; i < 8; i++)
{
Node nxt(que[queHead].x + dx[i], que[queHead].y + dy[i]);
if (nxt.isInMap(m, n) && !vis[nxt.x][nxt.y] && mat[nxt.x][nxt.y] == '@')
{
que[queTail++] = nxt;
vis[nxt.x][nxt.y] = true;
}
}
}
int main()
{
int ret = 0, m, n;
while (true)
{
ret = 0;
memset(vis, 0, sizeof(vis));
cin >> m >> n;
if (m == 0 && n == 0)
break;
for (int i = 0; i < m; i++)
for (int j = 0; j < n; j++)
cin >> mat[i][j];
for (int i = 0; i < m; i++)
{
for (int j = 0; j < n; j++)
{
if (mat[i][j] == '@'&&!vis[i][j])
{
bfs(i, j, m, n);
ret++;
}
}
}
printf("%d\n", ret);
}
return 0;
}