Red and Black

Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u
Submit Status

Description

There is a rectangular room, covered with square tiles. Each tile is colored either red or black. A man is standing on a black tile. From a tile, he can move to one of four adjacent tiles. But he can't move on red tiles, he can move only on black tiles. 

Write a program to count the number of black tiles which he can reach by repeating the moves described above. 

Input

The input consists of multiple data sets. A data set starts with a line containing two positive integers W and H; W and H are the numbers of tiles in the x- and y- directions, respectively. W and H are not more than 20. 

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) 

Output

For each data set, your program should output a line which contains the number of tiles he can reach from the initial tile (including itself).

Sample Input

6 9
....#.
.....#
......
......
......
......
......
#@...#
.#..#.
11 9
.#.........
.#.#######.
.#.#.....#.
.#.#.###.#.
.#.#..@#.#.
.#.#####.#.
.#.......#.
.#########.
...........
11 6
..#..#..#..
..#..#..#..
..#..#..###
..#..#..#@.
..#..#..#..
..#..#..#..
7 7
..#.#..
..#.#..
###.###
...@...
###.###
..#.#..
..#.#..
0 0

Sample Output

45
59
6
13
 1 #include<cstdio>
 2 #include<cstring>
 3 char a[30][30];
 4 bool b[30][30];
 5 int dx[4]={0,1,-1,0};  
 6 int dy[4]={1,0,0,-1};  
 7 int ans,m,n,x,y;
 8 void judge(int x,int y)  
 9 {  
10     int i,j;  
11     for(i=0;i<4;i++)  
12     {  
13         if(a[x+dx[i]][y+dy[i]]=='.'&&b[x+dx[i]][y+dy[i]]==false&&x+dx[i]>=0&&y+dy[i]>=0&&x+dx[i]<m&&y+dy[i]<n)  
14         {  
15             b[x+dx[i]][y+dy[i]]=true;  
16             ans++;  
17             judge(x+dx[i],y+dy[i]);  
18         }  
19     }  
20 }  
21 int main()
22 {
23     int i,j;
24     while(scanf("%d %d",&n,&m),n,m)
25     {
26         memset(b,false,sizeof(b));
27         for(i = 0;i < m;i++)
28         {
29             getchar();
30             for(j = 0;j < n;j++)
31             {
32                 scanf("%c",&a[i][j]);
33                 if(a[i][j]=='@')
34                 {
35                     x=i;
36                     y=j;
37                     b[i][j]=true;
38                 }
39             }    
40         }
41         ans = 0;
42         judge(x,y);
43         printf("%d\n",ans+1);  
44     }
45     return 0;
46 }

 

posted @ 2016-07-28 11:39  菜鸟龙*  阅读(198)  评论(0编辑  收藏  举报