Description
Write a program to count the number of black tiles which he can reach by repeating the moves described above.
Input
There are H more lines in the data set, each of which includes W characters. Each character represents the color of a tile as follows.
'.' - a black tile
'#' - a red tile
'@' - a man on a black tile(appears exactly once in a data set)
The end of the input is indicated by a line consisting of two zeros.
Output
Sample Input
6 9 ....#. .....# ...... ...... ...... ...... ...... #@...# .#..#. 11 9 .#......... .#.#######. .#.#.....#. .#.#.###.#. .#.#..@#.#. .#.#####.#. .#.......#. .#########. ........... 11 6 ..#..#..#.. ..#..#..#.. ..#..#..### ..#..#..#@. ..#..#..#.. ..#..#..#.. 7 7 ..#.#.. ..#.#.. ###.### ...@... ###.### ..#.#.. ..#.#.. 0 0
Sample Output
45 59 6 13
大致题目描述:
有一个长方形的房间,覆盖着方形的瓷砖。每瓦颜色是红色或黑色。一个男人站在一个黑色的瓷砖上。从一个瓷砖,他可以移动到四个相邻的瓷砖之一。但他不能在红色的瓷砖上移动,他只能在黑色的瓷砖上移动。
编写一个程序来计数的数量,他可以达到通过重复上述动作所描述的黑砖。
代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX 20
int W, H;
char a[MAX][MAX];
int count = 0;
int dx[4] = {1,0,-1,0},dy[4]={0,1,0,-1};
int x,y;
void dfs(int nx, int ny)
{
if(nx >= 0 && nx < H && ny >= 0 && ny < W && a[nx][ny] =='.')
{
a[nx][ny] = '#';
count++;
}
else
return;
for(int i = 0; i < 4; i++)
{
x = nx + dx[i];
y = ny + dy[i];
if(a[x][y]=='.')
{
dfs(x,y);
}
}
}
int main()
{
int nx=0,ny=0;
while(scanf("%d%d\n",&W, &H) && (W || H))
{
for(int i=0; i<H; i++)
{
for(int j=0; j<W; j++)
{
scanf("%c",&a[i][j]);
if(a[i][j]=='@')
{
nx = i;
ny = j;
}
}
getchar();
}
a[nx][ny] = '.';
dfs(nx,ny);
printf("%d\n",count++);
count=0;
}
return 0;
}