Poj 1979 Red and Black——蒟蒻代码

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;
 } 

猜你喜欢

转载自blog.csdn.net/weixin_43491303/article/details/88063982