基础深搜题,先遍历整个地图,找到一个 ' @ ',然后进行深搜,找到所有与当前 ' @ ' 相连的 ' @ ',并标记为 ' * ',以后不再搜索此处。每进行一次深搜,计数加一,直到地图中所有点都是 ' * ',搜索结束,输出计数。
#include<iostream>
using namespace std;
const int MAXN = 105;
int m, n; //地图边长
char mp[MAXN][MAXN]; //地图
int dir[8][2] = { { -1, -1 }, { -1, 0 }, { -1, 1 }, { 0, 1 },
{ 0, -1 }, { 1, 1 }, { 1, 0 }, { 1, -1 } }; //8个移动方向
//深搜,搜索所有与(x,y)相连的油坑
void DFS(int x, int y)
{
mp[x][y] = '*'; //每个油坑只搜索一次
for (int i = 0; i < 8; i++) //依次搜索8个方向
{
int nx = x + dir[i][0];
int ny = y + dir[i][1];
if (nx >= m || ny >= n || nx < 0 || ny < 0) //越界
continue;
if (mp[nx][ny] == '@') //找到相连的油坑,继续深搜
DFS(nx, ny);
}
}
int main()
{
while (cin >> m)
{
if (m == 0)
break;
cin >> n;
for (int i = 0; i < m; i++) //输入地图
{
for (int j = 0; j < n; j++)
cin >> mp[i][j];
}
int count = 0; //油藏数量
for (int i = 0; i < m; i++)
{
for (int j = 0; j < n; j++)
{
if (mp[i][j] == '@') //搜索与当前油坑相连的油坑
{
DFS(i, j);
++count; //每深搜一次,计数加一
}
}
}
cout << count << endl;
}
return 0;
}
继续加油。