在算法练习的初期。果然还是要专注于某一个算法,多次的进行练习。
以前那种广撒网式的练习方式还是不对的。
练习了三道搜dfs之后,觉得终于掌握了一点点啦。也能水出简单的了。
成就感!
发现很容易导致错误的一个原因就是 使用了全局变量之后忘记初始化。
本题思路:
对八个方向进行搜索。
搜索的起点一定要是@,不能直接从第一个点开始搜索。
AC代码如下:
#include<iostream>
#include<cstdio>
using namespace std;
#define MAXN 110
int n, m, oil[MAXN][MAXN], vis[MAXN][MAXN];
void dfs(int i,int j){
if (oil[i][j] == 0 || vis[i][j] == 1){
return;
}
vis[i][j] = 1;
dfs(i - 1, j);
dfs(i - 1, j - 1);
dfs(i - 1, j + 1);
dfs(i, j - 1);
dfs(i, j + 1);
dfs(i + 1, j - 1);
dfs(i + 1, j);
dfs(i + 1, j + 1);
}
int main()
{
int i,j,fmark,num;
char c;
while (cin >> n >> m && (n != 0 && m != 0)){
fmark = 0;
memset(oil, 0, sizeof(oil));
for (i = 1; i <= n; i++){
for (j = 1; j <= m; j++){
cin >> c;
if (c == '*'){
oil[i][j] = 0;
}
else{
oil[i][j] = 1;
}
}
}
memset(vis,0,sizeof(vis));
num = 0;
for (i = 1; i <= n; i++){
for (j = 1; j <= m; j++){
if (oil[i][j] == 1 && vis[i][j] == 0){
dfs(i,j);
num++;
}
}
}
cout << num << endl;
}
return 0;
}