POJ-1979(搜索水题)

ゞ 浴缸里的玫瑰 2022-09-26 02:17 245阅读 0赞

题目链接-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.

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

  1. 6 9
  2. ....#.
  3. .....#
  4. ......
  5. ......
  6. ......
  7. ......
  8. ......
  9. #@...#
  10. .#..#.
  11. 11 9
  12. .#.........
  13. .#.#######.
  14. .#.#.....#.
  15. .#.#.###.#.
  16. .#.#..@#.#.
  17. .#.#####.#.
  18. .#.......#.
  19. .#########.
  20. ...........
  21. 11 6
  22. ..#..#..#..
  23. ..#..#..#..
  24. ..#..#..###
  25. ..#..#..#@.
  26. ..#..#..#..
  27. ..#..#..#..
  28. 7 7
  29. ..#.#..
  30. ..#.#..
  31. ###.###
  32. ...@...
  33. ###.###
  34. ..#.#..
  35. ..#.#..
  36. 0 0

Sample Output

  1. 45
  2. 59
  3. 6
  4. 13

Source

Japan 2004 Domestic

题目大意:给你一张地图,’@’为你的初始位置,‘.’为可以走的地方,’#‘为墙不可通过,问你从初始位置出发最多可以走多少步,走过的地方不能走第二次,起始位置也算一步。

题目思路:简单的bfs,输入时记录下初始位置,然后从这点开始bfs,用队列存可以走的点,进队时把改点改为’#‘,也可以用标记,然后答案+1,最后走完后输出所求的答案,时间复杂度为O(W*H),最多每个点都进出一次队列!

AC代码:

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<queue>
  5. using namespace std;
  6. const int maxn = 22;
  7. char Map[maxn][maxn];
  8. int fx[4][2]={1,0,-1,0,0,-1,0,1};
  9. int n,m;
  10. int bfs(int x,int y){
  11. int res=1;
  12. Map[x][y]='#';
  13. queue<pair<int,int> >q;
  14. q.push(make_pair(x,y));
  15. while(!q.empty()){
  16. x=q.front().first;
  17. y=q.front().second;
  18. q.pop();
  19. for(int i=0;i<4;i++){
  20. int h=x+fx[i][0],l=y+fx[i][1];
  21. if(h>=0&&h<n&&l>=0&&l<m&&Map[h][l]=='.'){
  22. res++;
  23. Map[h][l]='#';
  24. q.push(make_pair(h,l));
  25. }
  26. }
  27. }
  28. return res;
  29. }
  30. int main()
  31. {
  32. while(cin>>m>>n&&(n+m)){
  33. int x,y;
  34. for(int i=0;i<n;i++)
  35. {
  36. scanf("%s",Map[i]);
  37. for(int j=0;j<m;j++)
  38. if(Map[i][j]=='@')x=i,y=j;
  39. }
  40. cout<<bfs(x,y)<<endl;
  41. }
  42. return 0;
  43. }

发表评论

表情:
评论列表 (有 0 条评论,245人围观)

还没有评论,来说两句吧...

相关阅读

    相关 poj1979 简单bfs

    题意: 就是给一个矩形,由.和\还有@组成,\不能走,然后一个人站在@处,问这个人最多可以走的位置有哪些。 一个简单的bfs,然后看vis数组里面有多少个位置被标