• 迷宫


    迷宫

     
    描述
    一天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 <cstdio>
    #include <cstdlib>
    #include <cstring>
    #include <cmath>
    #include <iostream>
    
    using namespace std;
    	
    const int dx[4]={1,-1,0,0};
    const int dy[4]={0,0,1,-1};//定义移动方向
    	
    char tu[101][101];//定义全图
    int ha,la,hb,lb,n;
    int t;
    bool flag=false;//定义flag
    	
    void dfs(int ha,int la){//定义dfs函数,输入当前行与列
    tu[ha][la]='#';//封闭当前位置
    if(ha==hb&&la==lb){
    flag=true;
    }//若可以到达B点,定义flag为true;
    else for(int i=0;i<4;i++){
    int hh=ha+dx[i];
    int ll=la+dy[i];//枚举移动的方式
    if(hh>0&&hh<=n&&ll>0&&ll<=n&&tu[hh][ll]=='.'&&vhash[hh][ll]==0){//可行性判断
    dfs(hh,ll);//进行下一次函数
    }
    }
    }
    	
    void readp(){
    scanf("%d",&t);//输入数据量
    while (t--){//循环输入数据
    cin>>n;
    for(int i=1;i<=n;i++)
    for(int j=1;j<=n;j++)
        cin>>tu[i][j];//输入全图
    cin>>ha>>la>>hb>>lb;//输入A点行与列,B点行与列(此处是从0开始)
    ha+=1;
    la+=1;
    hb+=1;
    lb+=1;//调整至从1开始
    if(tu[ha][la]=='.'&&tu[hb][lb]=='.')dfs(ha,la);//判断A,B点是否可通行
    	if(flag)cout<<"YES"<<endl;
    	    else cout<<"NO"<<endl;//根据flag输出结果
    	    flag=false;//刷新flag
    	}
    	}
    	
    	int main(){
    	    readp();
    	    return 0;
    	}
    错因分析:
    1.tu数组不符合大小
    2.刷新地图,导致超时
    3.未考虑“起点或者终点有一个不能通行(为#)“的情况
  • 相关阅读:
    DFS的联通性问题
    Stl-unordered_map 无序关联式容器的基本用法(xmind)
    【图论】匈牙利算法——社会人数规模专家
    AcWing 860. 染色法判定二分图
    AcWing 1227. 分巧克力(二分)
    【图论】【最小生成树】prim【AcWing】局域网&&繁忙的都市
    【图论】拓扑排序
    Stl—bitset用法
    vector< vector<int> > 的初始化
    Floyd——人人都是中间商(50%)
  • 原文地址:https://www.cnblogs.com/shenlaizhibi/p/5861234.html
Copyright © 2020-2023  润新知