难民救助 八连块问题

1455: 难民救助

Time Limit: 1 Sec   Memory Limit: 128 MB
Submit: 36   Solved: 0
[ Submit][ Status][ Web Board]

Description

某国家由于发生了战争,A地区遭到了严重的破坏,为了救助A地区的难民,该国家将A地区划分成了n*m个矩形的区域,这些矩形可能上、下、左、右连通,每一个区域内可能有人,也可能没有人。在一个区域内设置一个难民营后,可以将和该区域相连的其它区域中的难民全部收容,请帮忙计算为了安置所有的难民,最少要设置多少座难民营。

Input

先输入两个整数n和m(1<=n,m<=50)。接着有n行,每行有m个字符。#表示该区域有难民,!则表示该区域没有难民。

Output

对于每组测试数据,输出最少需要架设几座难民营。

Sample Input

2  2 
#  !
!#

Sample Output

2

这点道题其实就是简单的dfs搜索题,可能会有所不注意的就是输入的数据之间有空格,

还有一点,输入的字符一定不要是中文标点字符,因为中文标点字符需要占用两个字节,而普通的字符只需要一个字节

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath> 
using namespace std;
const int max1=100+5;
char blk[max1][max1];
int m,n,bnum[max1][max1];
void dfs(int t,int y,int u)//定义dfs函数 
{
	if(t<0||t>=n||y<0||y>=m)return;
	if(bnum[t][y]>0||blk[t][y]!='#')return;
	bnum[t][y]=u;//若该位置被访问则,将该位置值修改为不为零 
	for(int i1=-1;i1<=1;i1++)
	{
		for(int j1=-1;j1<=1;j1++)
		{
			if(abs(i1+j1)==0||abs(i1+j1)==2)continue;//注意本题给的条件是上下左右相邻才算相连,对角并不算 
			dfs(t+i1,y+j1,u);
		}
	}
}
int main()
{
	scanf("%d%d",&n,&m);getchar();
	for(int i=0;i<n;i++)
	{
		for(int j=0;j<m;j++)
		{
			scanf("%c",&blk[i][j]);
			if(blk[i][j]==' ')//因为输入时可能输入空格,所以应该将其剔除出字符串 
			{
				blk[i][j]='\0';
				j=j-1;
			}
		}
		getchar();
	}
	memset(bnum,0,sizeof(bnum));
	int num=0;
	for(int i=0;i<n;i++)
	{
		for(int j=0;j<m;j++)
		{
			if(bnum[i][j]==0&&blk[i][j]=='#')
			{
				dfs(i,j,++num);//dfs搜索开始条件,每一个新的搜索开始运行时,上一个搜索已经运行结束,即上一个对应点所能联通的点都已经进行标记 
			}
		}
	}
	printf("%d\n",num);
	return 0;
} 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值