Description
一个矩形房间中铺着正方形瓷砖,每个瓷砖被涂成红色或者黑色。一名男子正站在黑色瓷砖上,由此出发可以一道相邻的四个瓷砖之一,但是不能再移动到红砖上,只能移动到黑砖上,编写一个程序,计算他所能到达的黑砖个数。
Input
输入包含多个测试用例。一组测试用例第一行是两个正整数W和H。W、H分别是瓷砖再x和y轴方向上的瓷砖数,W和H都不超过20。每行测试用例包括H行,每行W个字符,每个字符的代表意义如下:
‘.’ - 黑砖
‘#’ - 红砖
‘@’ - 男子(每个测试用例中只出现一次)
两个0表示输入结束。
Output
每个测试用例下面输出男子所能到达的黑砖数。
Sample Input
6 9
…#.
…#
…
…
…
…
…
#@…#
.#…#.
11 9
.#…
.#.#######.
.#.#…#.
.#.#.###.#.
.#.#…@#.#.
.#.#####.#.
.#…#.
.#########.
…
11 6
…#…#…#…
…#…#…#…
…#…#…###
…#…#…#@.
…#…#…#…
…#…#…#…
7 7
…#.#…
…#.#…
###.###
…@…
###.###
…#.#…
…#.#…
0 0
Sample Output
45
59
6
13
参考一个大佬的代码后写的,蒟蒻表示自己根本想不到,哭了。。
#include<stdio.h>
#include<string.h>
const int maxn=25;
int count=0,W=0,H=0;
char tile[maxn][maxn];
int nx,ny;
int dfsx[]={0,-1,0,1},dfsy[]={1,0,-1,0};/*表示上下左右移动一格*/
void dfs(int x,int y)/*深度搜索*/
{
if(x>=0&&x<H&&y>=0&&y<W&&tile[x][y]=='.'){/*保证该点再矩形内且为黑色*/
tile[x][y]='#';/*表示已经访问过*/
count++;/*可到达的瓷砖数+1*/
}
else return;/*返回,换个方向继续*/
for(int i=0;i<4;i++){/*上下左右每个都遍历一次*/
nx=x+dfsx[i];/*不能用x=x+dfsx[i],因为每次上下左右的移动式基于原点*/
ny=y+dfsy[i];
if(tile[nx][ny]=='.')/*通过上下左右移动后,如果该点依然为黑色,则继续搜索*/
dfs(nx,ny);
}
}
int main()
{
int x,y;
while((scanf("%d %d\n",&W,&H))&&(W||H)){/*保证都能每次输入且W和H不为0*/
for(int i=0;i<H;i++){/*一行一行的输入*/
for(int j=0;j<W;j++){
scanf("%c",&tile[i][j]);
if(tile[i][j]=='@'){/*如果是人所在地就记录下来*/
x=i;
y=j;
}
}
getchar();
}
tile[x][y]='.';/*将人所在地设为黑色,进入dfs进行搜索*/
dfs(x,y);
printf("%d\n",count);
count=0;/*每一次while循环都清零,注意细节*/
}
return 0;
}