图着色问题:
【题目描述】
由于最近的降雨,水汇集在Farmer John’s田地的不同地方,其由N×M(1 <= N <= 100; 1 <= M <= 100)的正方形矩形表示。每个方格包含水(‘W’)或旱地(’。’)。农民约翰想弄清楚他的田地里有多少个池塘。池塘是一组连接的正方形,其中有水,其中一个正方形被认为与其所有八个邻居相邻。
给出农夫约翰的田地图,确定他有多少池塘。
【输入】
第1行:两个以空格分隔的整数:N和M
第2…N + 1行:每行M个字符代表一行Farmer John的田地。每个字符都是’W’或’。’。字符之间没有空格。
【输出】
第1行:Farmer John的田间池塘数量。
【输入示例】
10 12
W…WW.
.WWW…WWW
…WW…WW.
…WW.
…W…
…W…W…
.W.W…WW.
W.W.W…W.
.W.W…W.
…W…W.
【输出示例】
3
思路::遍历整个图,只要遇到 “ W ” 就进行深搜 ,深搜的原理跟上面的案例一样,不过不需要加标记变量标记该点是否已经走过;深搜的时候,只需要把能够深搜到的 “ W ” 全部变成 “ . ” 就可以了。最后进行多少次dfs就是题目的解。emmmmm,就是这样的。
代码表示:
#include<iostream>
using namespace std;
//W .
int N,M;
//N行M列
char mapp[101][101];
int nextt[8][2]={{0,1},{1,1},{1,0},{1,-1},{0,-1},{-1,-1},{-1,0},{-1,1}};
void dfs(int x,int y)
{
mapp[x][y]='.'; //变为陆地
for(int i=0;i<8;i++)
{
int gx=x+nextt[i][0];
int gy=y+nextt[i][1];
//只要不越界,就深搜下一个点
if(gx>=0&&gx<N&&gy>=0&&gy<M&&mapp[gx][gy]=='W')
dfs(gx,gy);
}
}
int main()
{
int ans=0;
cin >> N >> M;
for(int i=0;i<N;i++)
for(int j=0;j<M;j++)
cin >> mapp[i][j];
for(int i=0;i<N;i++)
{
for(int j=0;j<M;j++)
{
if(mapp[i][j]=='W')
{
dfs(i,j);
ans++;
}
}
}
cout << ans << endl;
return 0;
}