ZOJ 2165

利用广度优先搜索,对可以达到的“.”进行统计;

每一个点对应有4个方向,每一个都去尝试

  1. #include <iostream>
  2. #include <queue>
  3. #include <string.h>
  4. using namespace std;
  5. struct tile{
  6. public:
  7.     int x,y;
  8.     void init(int nx,int ny){
  9.         x=nx;
  10.         y=ny;
  11.     }
  12. };
  13. char square[21][21];
  14. int visit[21][21];
  15. int step[4][2]={{1,0},{-1,0},{0,-1},{0,1}};
  16. int count(char square[21][21],tile start,int w,int h){
  17.     memset(visit,0,sizeof(visit));
  18.     int x,y,nx,ny,sum=0;
  19.     queue<tile> q;
  20.     q.push(start);
  21.     //cout<<square[1]<<endl;
  22.     while(!q.empty()){
  23.         tile t=q.front();
  24.         q.pop();
  25.         int x=t.x,y=t.y;
  26.         sum++;
  27.         for(int i=0;i<4;i++){                   //对4个方向进行统计
  28.             nx=x+step[i][0];
  29.             ny=y+step[i][1];
  30.             if(nx<0||nx>=w||ny<0||ny>=h)continue;
  31.             if(visit[nx][ny])continue;
  32.             if(square[ny][nx]!='.')continue;    
  33.             tile c;
  34.             c.init(nx,ny);
  35.             q.push(c);
  36.             visit[nx][ny]=1;
  37.         }
  38.     }
  39.     return sum;  
  40. }
  41. int main()
  42. {   int w,h,x,y;
  43.     while(cin>>w>>h){
  44.         if(w==0)break;
  45.         for(int i=0;i<h;i++){
  46.             for(int j=0;j<w;j++){
  47.                 cin>>square[i][j];
  48.                 if(square[i][j]=='@'){
  49.                     x=j;                          //列
  50.                     y=i;                          //行
  51.                 }
  52.             }
  53.         }
  54.         tile start;
  55.         start.init(x,y);
  56.         cout<<count(square,start,w, h)<<endl;
  57.         memset(square,'',sizeof(square));
  58.     }
  59.     return 0;
  60. }
原文地址:https://www.cnblogs.com/Mr-Xu-JH/p/3843142.html