Loading

hdu 1312 Red and Black

题目传送门
解题思路:运用 \(dfs\) 求出所有的连通块(此题为模板题)

#include<bits/stdc++.h>
using namespace std;
inline int read()//快读 
{
	int x=0,k=1;char c=getchar();
	while(c<'0' || c>'9'){if(c=='-') k=0;c=getchar();}
	while(c>='0' && c<='9') x=(x<<3)+(x<<1)+(c^48),c=getchar();
	return k?x:-x;
}
int w,h,sx,sy,ans;
char ch[30][30];
int dx[]={0,1,0,-1};
int dy[]={1,0,-1,0};
void dfs(int x,int y)//深搜 
{
	if(ch[x][y]=='.')//如果当前位置是 . 
	{
		ans++;//那么把能经过的黑块数加一 
		ch[x][y]='#';//然后把这个经过的黑块变为红块 
	}
	for(int i=0;i<4;i++)//遍历四个方向 
	{
		int nx=x+dx[i];//下一个 x 设为当前 x 加上一个 dx[i],表示向左还是向右还是不动 
		int ny=y+dy[i];//下一个 y 设为当前 y 加上一个 dy[i],表示向上还是向下还是不动 
		if(nx>=0 && nx<w && ny>=0 && ny<=h && ch[nx][ny]=='.') dfs(nx,ny);
		//如果这个 nx 在范围内,并且 ny 也在范围内,并且下一个格是 . 那么就深搜 nx,ny 
	}
}
int main()
{
	while(h=read(),w=read())//输入 
	{
		if(!w && !h) break;//如果两个数都是 0 就退出 
		ans=1;//将ans设为 1,因为 @ 也算一个黑格 
		bool f=0;//判断是否还需判断是否有 @ 
		for(int i=0;i<w;i++)//循环w行 
		{
			scanf("%s",ch[i]);//输入当前行 
			for(int j=0;!f && j<h;j++)//循环当前行的每一列 
			{
				if(ch[i][j]=='@')//如果当前格是 @ 
				{
					sx=i;//记录 @ 的横坐标 
					sy=j;//记录 @ 的纵坐标 
					f=1;//把 f 设为 1,不在判断是否有 @ 
					break;
				}
			}
		}
		dfs(sx,sy);//从起点 @ 开始深搜 
		printf("%d\n",ans);//输出 
	}
	return 0;
}
posted @ 2020-02-02 22:29  ForeverOIer  阅读(93)  评论(0编辑  收藏  举报