Red and Black ——DFS

来源:互联网 发布:mac os 官方镜像 编辑:程序博客网 时间:2024/06/09 16:48


          【郑轻oj】1312

  

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


4559613

                

#include<cstdio>#include<algorithm>#include<stack>#include<queue>using namespace std;int w,l;char map[21][21];int ans;int fx[4]={0,0,-1,1};int fy[4]={1,-1,0,0};int x,y;void dfs(int x,int y){if(x<0||x>=l||y<0||y>=w)/*判断条件:当超过界限的时候回溯或者碰到'#'的时候回溯*/ return;if(map[x][y]=='#')return;ans++;map[x][y]='#';/*标记已经遍历过的,防止再次遍历*/ for(int i=0;i<4;i++)/*总共上下左右4个方向 所以i<4*/ dfs(x+fx[i],y+fy[i]);}int main(){scanf("%d%d",&w,&l);while(w&&l){for(int h=0;h<l;h++){scanf("%s",&map[h]);for(int j=0;j<w;j++){if(map[h][j]=='@')/*寻找初始位置*/ {x=h;                    //     0 1 2 3y=j;                    //   0 * * * *}                           //   1 - * - *}                               //   2 * + * -  }                                   //   3 - - - *   ans=0;dfs(x,y);printf("%d\n",ans);scanf("%d%d",&w,&l);} return 0;}

            

原创粉丝点击