POJ-1979

Red and Black
Time Limit: 1000MS   Memory Limit: 30000K
Total Submissions: 36371   Accepted: 19731

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) 
The end of the input is indicated by a line consisting of two zeros. 

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

 

题意:

@为起点,只能走' . ',求最多能走多少。

 

dfs求出所有可行路径,每走过一次则将' . '转换为' # ',防止重复。

 

AC代码:

 1 #include<bits/stdc++.h>//注意poj提交时需要更换头文件
 2 using namespace std;
 3 
 4 int dx[4]={-1,0,1,0},dy[4]={0,1,0,-1};
 5 char mp[50][50];
 6 int w,h,sx,sy;
 7 int res;
 8 
 9 void dfs(int x,int y){
10     //cout<<mp[x][y]<<endl;
11     if(mp[x][y]=='.'){
12         res++;
13         mp[x][y]='#';
14         //cout<<x<<' '<<y<<endl;
15     }
16     else
17     return ;
18     for(int i=0;i<4;i++){
19         x+=dx[i];
20         y+=dy[i];
21         //cout<<x<<" "<<y<<endl;
22         dfs(x,y);
23         x-=dx[i];
24         y-=dy[i]; 
25     }
26     return ;
27 }
28 
29 int main(){
30     ios::sync_with_stdio(false);
31     while(cin>>w>>h&&w&&h){
32         memset(mp,'#',sizeof(mp));
33         for(int i=0;i<h;i++){
34             for(int j=0;j<w;j++){
35                 cin>>mp[i][j];
36                 if(mp[i][j]=='@'){
37                     sx=i;
38                     sy=j;
39                 }
40             }
41         }
42         mp[sx][sy]='.';
43         res=0;
44         dfs(sx,sy);
45         cout<<res<<endl;
46     }
47     return 0;
48 } 

 

posted @ 2017-07-26 20:25  Kiven#5197  阅读(222)  评论(0编辑  收藏  举报