一道基礎的圖的歷遍的題。
思路是由一個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;
}