zoukankan      html  css  js  c++  java
  • POJ2790(BFS)

    2790:迷宫

    时间限制:

    3000ms

    内存限制:

    65536kB

    描述

    一天Extense在森林里探险的时候不小心走入了一个迷宫,迷宫可以看成是由n * n的格点组成,每个格点只有2种状态,.和#,前者表示可以通行后者表示不能通行。同时当Extense处在某个格点时,他只能移动到东南西北(或者说上下左右)四个方向之一的相邻格点上,Extense想要从点A走到点B,问在不走出迷宫的情况下能不能办到。如果起点或者终点有一个不能通行(为#),则看成无法办到。

    输入

    第1行是测试数据的组数k,后面跟着k组输入。每组测试数据的第1行是一个正整数n (1 <= n <= 100),表示迷宫的规模是n * n的。接下来是一个n * n的矩阵,矩阵中的元素为.或者#。再接下来一行是4个整数ha, la, hb, lb,描述A处在第ha行, 第la列,B处在第hb行, 第lb列。注意到ha, la, hb, lb全部是从0开始计数的。

    输出

    k行,每行输出对应一个输入。能办到则输出“YES”,否则输出“NO”。

    样例输入

    2

    3

    .##

    ..#

    #..

    0 0 2 2

    5

    .....

    ###.#

    ..#..

    ###..

    ...#.

    0 0 4 0

    样例输出

    YES

    NO

     

    #include"iostream"
    #include"cstring"
    using namespace std;
    void bfs(int,int);
    int end[2];//设为全局,不用传参数了
    char mat[102][102];  
    bool vis[102][102];
    int main()      
    {                   
     int t;         
     cin>>t;
     int n;        
     while(t--)  
     {     
      memset(mat,'#',sizeof(mat));
      memset(vis,false,sizeof(vis));
            cin>>n;  
      char temp[100];    
         for(int i=0;i<n;i++)   
      {           
       cin>>temp;  
       for(int j=0;j<n;j++)//稍作处理,向右下方移位  
       {
        mat[i+1][j+1]=temp[j];  
       }
      }   
      
      int begin[2];   
            cin>>begin[0]>>begin[1]>>end[0]>>end[1];   
      if(mat[begin[0]+1][begin[1]+1]=='#'||mat[end[0]+1][end[1]+1]=='#')//先判断起始点是否合法
      {
       cout<<"NO"<<endl; 
           continue;    
             }     
      bfs(begin[0]+1,begin[1]+1);
      if(vis[end[0]+1][end[1]+1]==true)//注意了,矩阵是做了向右下方移位的处理的,begin需要处理一下;若终点被访问过则说明可以成功
       cout<<"YES\n";     
      else                            
       cout<<"NO\n";  
     }                                          
    }                                              
    int dir[4][2]={{0,1},{0,-1},{1,0},{-1,0}}; 
    void bfs(int x,int y)   
    {              
     if(mat[x][y]=='.')
     {
     //处理当前点            
         vis[x][y]=true;     
        //处理下一阶段的点
        {
        int u,v;                         
        for(int i=0;i<4;i++)//遍历四个方向  
        {                                        
          u=x+dir[i][0];     
       v=y+dir[i][1];                 
         if(mat[u][v]=='.')   
         {                              
          if(!vis[u][v])          
         bfs(u,v);         
         }//end outest if       
        }//end for
        }//end 处理下一阶段的点 else
    }//end  if(mat[x][y]=='.')
    }

  • 相关阅读:
    Hadoop集群(三) Hbase搭建
    Hadoop集群(二) HDFS搭建
    Hadoop集群(一) Zookeeper搭建
    Redis Cluster 添加/删除 完整折腾步骤
    Redis Cluster在线迁移
    Hadoop分布式HA的安装部署
    Describe the difference between repeater, bridge and router.
    what is the “handover” and "soft handover" in mobile communication system?
    The main roles of LTE eNodeB.
    The architecture of LTE network.
  • 原文地址:https://www.cnblogs.com/lzhitian/p/2140067.html
Copyright © 2011-2022 走看看