POJ - 1979 Red and Black (dfs+染色)
点击进入原题
####个人觉得这道题其实就是要算连续的 ‘.’ 的个数,然后有 ‘#’ 阻挡了。
####思路:搜索@确定开始的位置,把@变为 ’#‘;然后查找四个方向找 ‘.’ 并逐个变为 ’#‘ ; 定义全局变量按时加以计数,最后打印出答案,emmm因为有可能出现多个例子所以ans得记得初始化为0;
#include <iostream>
using namespace std;
int w,h,ans=0;
char a[21][21];
void dfs(int i, int j){
a[i][j]='#';ans++;
//查找四个方向
if (a[i+1][j]=='.'&&(i+1)<w)dfs(i+1,j);
if (a[i-1][j]=='.'&&(i-1)>=0)dfs(i-1,j);
if (a[i][j+1]=='.'&&(j+1)<h)dfs(i,j+1);
if (a[i][j-1]=='.'&&(j-1)>=0)dfs(i,j-1);
return ;
}
int main()
{
while(cin >> h >> w)
{
if (w==0&&h==0) return 0;
for (int i=0;i<w;i++){
for(int j=0;j<h;j++){
cin >> a[i][j];
}
}
for (int i=0;i<w;i++){
for(int j=0;j<h;j++){
if (a[i][j]=='@') dfs(i,j);
}
}
cout<< ans<<endl;
ans=0;
}
}
这个算法真有点厉害,递归很厉害,自己写了出来超级开心哈哈哈,emmm毕竟是前天刚学的,今天一开始还有点忘记了,,惭愧。
–2020.02.12