深搜:图着色问题

图着色问题:
【题目描述】

由于最近的降雨,水汇集在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;
}
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值