• 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]=='.')
    }

  • 相关阅读:
    python模块之__future__模块
    SQL之分组排序取top n
    SQL之层次查询
    win server 2008添加磁盘-脱机转换为联机状态方法
    拉链表-增量更新方法一
    一道hive SQL面试题
    一道与时间差有关的SQL面试题
    (转)linux中nmcli命令的使用及网络配置
    (转)内核模块操作命令-lsmod+rmmod+modinfo+modprobe
    (转)Linux 系统设置 : dmesg 命令详解
  • 原文地址:https://www.cnblogs.com/lzhitian/p/2140067.html
Copyright © 2020-2023  润新知