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 0Sample 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 }
原文:http://www.cnblogs.com/Kiven5197/p/7241758.html