题目链接-POJ1979
Red and Black
Time Limit: 1000MS | Memory Limit: 30000K | |
Total Submissions: 31353 | Accepted: 17111 |
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.
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.
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,输入时记录下初始位置,然后从这点开始bfs,用队列存可以走的点,进队时把改点改为'#',也可以用标记,然后答案+1,最后走完后输出所求的答案,时间复杂度为O(W*H),最多每个点都进出一次队列!
AC代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
const int maxn = 22;
char Map[maxn][maxn];
int fx[4][2]={1,0,-1,0,0,-1,0,1};
int n,m;
int bfs(int x,int y){
int res=1;
Map[x][y]='#';
queue<pair<int,int> >q;
q.push(make_pair(x,y));
while(!q.empty()){
x=q.front().first;
y=q.front().second;
q.pop();
for(int i=0;i<4;i++){
int h=x+fx[i][0],l=y+fx[i][1];
if(h>=0&&h<n&&l>=0&&l<m&&Map[h][l]=='.'){
res++;
Map[h][l]='#';
q.push(make_pair(h,l));
}
}
}
return res;
}
int main()
{
while(cin>>m>>n&&(n+m)){
int x,y;
for(int i=0;i<n;i++)
{
scanf("%s",Map[i]);
for(int j=0;j<m;j++)
if(Map[i][j]=='@')x=i,y=j;
}
cout<<bfs(x,y)<<endl;
}
return 0;
}