red and black(BFS)

Red and Black
Time Limit: 1000MS   Memory Limit: 30000K
Total Submissions: 40685   Accepted: 22079

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

Source

 

题解:简单的BFS

AC代码

 1 #include<stdio.h>
 2 #include<iostream>
 3 #include<stdio.h>
 4 #include<string>
 5 #include<cmath>
 6 #include<algorithm>
 7 using namespace std;
 8 
 9 char a[25][25];
10 int w, h;
11 int ant;
12 
13 void dfs(int x, int y)
14 {
15     if(a[x][y] != '#' && x >= 0 && x < h && y >= 0 && y < w)
16     {
17         ant++;
18         a[x][y] = '#';
19         dfs(x+1, y);
20         dfs(x-1, y);
21         dfs(x, y+1);
22         dfs(x, y-1);
23     }
24 }
25 
26 int main()
27 {
28     while(scanf("%d%d", &w, &h) != EOF)
29     {
30         ant = 0;
31         if(w == 0 && h == 0)
32             break;
33         for(int i = 0; i < h; i++)
34         {
35             for(int j = 0; j < w; j++)
36             {
37                 cin >> a[i][j];
38             }
39         }
40         for(int i = 0; i < h; i++)
41             for(int j = 0; j < w; j++)
42                 if(a[i][j] == '@')
43                     dfs(i, j);
44         cout << ant << endl;
45     }
46     return 0;
47 }
View Code

 

posted @ 2018-03-29 21:44  Veritas_des_Liberty  阅读(329)  评论(0编辑  收藏  举报