分析:
看到这个题的第一反应是建图,然后依次深搜每一个点(在一次深搜中给搜到的点打上标记),深搜一次就是一个块,最后求块和
但是在在建图上面自己纠结于要建一个独立的邻接矩阵,过程很繁琐,后来看了参考代码后就改成遇到一个油田就深搜(还未被归属于某个块的)
这个题纠正了自己的对图深搜的理解,在Brute Force专题里的深搜就是去遍历解答树,找到符合要求的节点(答案),而这个深搜模板与图的深搜(stack)不同,我就特意划分开来,避免搞混,导致在这个题上第一反应也是深搜,但是却走了歪路(建图)。
AC CODE
#include <bits/stdc++.h>
using namespace std;
#define maxn 105
string sq[maxn];
int n, m, vis[maxn][maxn];
void dfs(int r, int c, int id)
{
//越界返回
if (r < 0 || r >= m || c < 0 || c >= n)
return;
//如果该位置是油田但已经属于某个连通块 或者不是油田 返回
if (vis[r][c] || sq[r][c] != '@')
return;
//打上标记
vis[r][c] = id;
//递归遍历周围方格的sq是不是油田
for (int i = -1; i <= 1; i++)
for (int j = -1; j <= 1; j++)
{
if (i == 0 && j == 0)
;
else
dfs(r + i, c + j, id);
}
}
int main()
{
while (cin >> m >> n && n && m)
{
for (int i = 0; i < m; i++)
cin >> sq[i];
int ans = 0;
memset(vis, 0, sizeof(vis));
for (int i = 0; i < m; i++)
for (int j = 0; j < n; j++)
{
if (!vis[i][j] && sq[i][j] == '@')
dfs(i, j, ++ans);
}
cout << ans << endl;
}
return 0;
}