Red and Black(poj 1979 bfs)

Red and Black
Time Limit: 1000MS   Memory Limit: 30000K
Total Submissions: 27891   Accepted: 15142

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

 1 #include <cstdio>
 2 #include <algorithm>
 3 #include <iostream>
 4 #include <cstring>
 5 #include <queue>
 6 using namespace std;
 7 char map[25][25];
 8 bool vis[25][25];
 9 int dx[4]={0,0,1,-1},dy[4]={1,-1,0,0};
10 int w,h;
11 int sx,sy;
12 struct node
13 {
14     int x,y;
15 };
16 int bfs()
17 {
18     queue<node> q;
19     int ans=0;
20     memset(vis,0,sizeof(vis));
21     node s,temp;
22     s.x=sx,s.y=sy;
23     q.push(s);
24     while(!q.empty())
25     {    
26         s=q.front();
27         q.pop();
28         ans++;
29         for(int i=0;i<4;i++)
30         {
31             temp.x=s.x+dx[i];
32             temp.y=s.y+dy[i];
33             if(temp.x>=0&&temp.x<h&&temp.y>=0&&temp.y<w&&vis[temp.x][temp.y]==0&&map[temp.x][temp.y]=='.')
34             {
35                 
36                 vis[temp.x][temp.y]=1;    
37                 q.push(temp);
38 
39             }
40         }
41     }
42     return ans;
43 }
44 int main()
45 {
46     int i,j;
47     freopen("in.txt","r",stdin);
48     while(scanf("%d%d",&w,&h))
49     {
50         if(w==0&&h==0)
51             break;
52         for(i=0;i<h;i++)
53             scanf("%s",map[i]);
54         for(i=0;i<h;i++)
55             for(j=0;j<w;j++)
56                 if(map[i][j]=='@')
57                 {
58                     sx=i,sy=j;
59                     break;
60                 }
61 
62         cout<<bfs()<<endl;
63     }
64     return 0;
65 }
原文地址:https://www.cnblogs.com/a1225234/p/5136828.html