1455: 难民救助
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 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;
}