dfs求解HDU 1312 Red and Black 搜索水题
有一个长方形的房间,上面铺着方瓷砖。每个贴图都是红色或黑色。一个人站在一块黑瓷砖上。从一个贴图,他可以移动到四个相邻贴图中的一个。但是他不能在红色的贴图上移动,只能在黑色的贴图上移动。
写一个程序来计算他通过重复上面描述的动作可以达到的黑色方块的数量。
输入
输入由多个数据集组成。数据集以包含两个正整数W和H的一行开始;W和H分别为x方向和y方向的瓦片数量。W和H不超过20。
数据集中共有H行,每行包含W个字符。每个字符都表示一个贴图的颜色,如下所示。
”。——一块黑色的瓷砖
“#”——一个红色的贴图
“@”——一个躺在黑色瓷砖上的人(在数据集中只出现一次)
输出
对于每个数据集,你的程序应该输出一行,其中包含他从初始贴图(包括自己)可以到达的贴图的数量。
题目大意,从标识为@的点开始标识为’ . '的地方可以走的通,而@的地方被拦截,问整个地图可走的长度。
AC代码如下
#include<stdio.h>
#include<string.h>
int w,h;//输入地图的大小
char m[25][25];//地图大小
int stax,stay;//开始探索的起始,stax,stay
int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};//对该点进行上下左右四个点方向探索
int sum=0;
void dfs(int x, int y)
{
int i,j;
int x1,y1;
for(i=0;i<4;i++)
{
x1=x+dx[i];
y1=y+dy[i];//下左右依次移动
if(m[x1][y1]=='.'&&x>0&&x<=h&&y>0&&y<=w)
{
sum++;
m[x1][y1]='#';//探索后变为#防止二次搜索
dfs(x1,y1);//重复探索
}
}
}
int main()
{
int i,j;
while(scanf("%d%d",&w,&h)&&w!=0&&h!=0)
{
getchar();//吸收回车
sum=0;
memset(m, 0, sizeof(m));
for(i=1;i<=h;i++)//输入地图并标记起点
{
for(j=1;j<=w;j++)
{
scanf("%c", &m[i][j]);
if(m[i][j]=='@')
{
stax=i;
stay=j;
m[i][j]='#';//起点算一个'.',标记后将它变成#
}
}
getchar();
}
dfs(stax,stay);
printf("%d\n", sum+1);
}
return 0;
}