POJ-1979

Posted Kiven#5197

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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
.#.........
.#.#######.
.#.#.....#.
.#.#.###.#.
.#.#[email protected]#.#.
.#.#####.#.
.#.......#.
.#########.
...........
11 6
..#..#..#..
..#..#..#..
..#..#..###
..#..#..#@.
..#..#..#..
..#..#..#..
7 7
..#.#..
..#.#..
###.###
[email protected]
###.###
..#.#..
..#.#..
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 } 

 

以上是关于POJ-1979的主要内容,如果未能解决你的问题,请参考以下文章

POJ 1979 Red and Black (简单dfs)

POJ 1979 DFS

poj1979 解题报告

水题-poj1979

[dfs] [FloodFill] POJ1979 Red And Black

POJ1979 Red and Black