一道基础的图的历遍的题。
思路是由一个v[][]标记当前位置是否被visit过,g[][]存储当前是否为pocket
每次DFS历遍一块deposit
主程序扫描g[][],没发现一块没有被visit过的pocket,就调用DFS以它为起点历遍它
代码如下:
#include<iostream>
using namespace std;
char g[110][110];
int vis[110][110];
int m, n;
void DFS(int r, int c) {
//检查边界
if (r < 0 || r >= m || c < 0 || c >= n)return;
if (vis[r][c] || g[r][c] == '*')return;
vis[r][c] = 1;
//访问8个方向
for (int i = -1; i <= 1; i++)
for (int j = -1; j <= 1; j++)
{
if (i == 0 && j == 0)continue;
DFS(r + i, j + c);
}
}
int main() {
FILE *stream;
freopen_s(&stream, "C:\\Users\\zgwng\\Desktop\\572OilDeposite.txt", "r", stdin);
scanf_s("%d %d", &m, &n);
char c = getchar();
while (m != 0) {
for (int i = 0; i < m; i++)
gets_s(g[i]);
int cnt = 0;
memset(vis, 0, sizeof(vis));
for(int i=0;i<m;i++)
for (int j = 0; j < n; j++)
if (!vis[i][j] && g[i][j] == '@') {
cnt++;
DFS(i, j);
}
cout << cnt << endl;
scanf_s("%d %d", &m, &n);
char c = getchar();
}
return 0;
}