zoukankan      html  css  js  c++  java
  • 迷宫(搜索)

    时间限制: 1000 ms         内存限制: 65536 KB
    提交数: 600     通过数: 245

    【题目描述】

    一天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
    

    这一题一看到就想到要用dfs,然后就不经思索地飞快的写好了一个dfs,然后爽快的测了一下样例,随后立即提交,返现完美地WA+TLE了。
    这中间蛀牙经历了很多的小错误以及一个大错误:

    1. 把数组从1开始存,但题目输入的起止点都是以0开始的。
    2. 输出的NO后面忘记换行。
    3. dfs时把起点写成了0,0
    4. 大错误:
      这样的一个算法的时间复杂度是很高的,大约有(O(2^(n^2)))左右。实际上,这样的dfs里面有很多冗余。由于这个题目并不是想要去求最短路,只要判断能否到达即可,因此对于一个已经知道可以到达的点,就不必再往后搜了。
    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    using namespace std;
    
    const int maxn=100+7;
    int T,n,sx,sy,tx,ty;
    int a[maxn][maxn],can[maxn][maxn];
    char s[maxn];
    
    void dfs(int x,int y){
    	if(x<0||x>=n||y<0||y>=n)return;
    	if(can[x][y]||a[x][y])return;
    	a[x][y]=can[x][y]=1;
    	dfs(x+1,y);
    	dfs(x-1,y);
    	dfs(x,y-1);
    	dfs(x,y+1);
    	a[x][y]=0;
    }
    
    void Init(){
    	memset(a,0,sizeof(a));
    	memset(can,0,sizeof(can));
    	scanf("%d",&n);
    	for(register int i=0;i<n;++i){
    		scanf("%s",s);
    		for(register int j=0;j<n;++j)
    			if(s[j]=='#')a[i][j]=1;
    	}
    }
    
    void Work(){
    	scanf("%d%d%d%d",&sx,&sy,&tx,&ty);
    	dfs(sx,sy);
    	if(can[tx][ty])printf("YES
    ");
    	else printf("NO
    ");
    }
    
    int main(){
    	scanf("%d",&T);
    	while(T--){
    		Init();
    		Work();
    	}
    	return 0;
    } 
    
  • 相关阅读:
    November 07th, 2017 Week 45th Tuesday
    November 06th, 2017 Week 45th Monday
    November 05th, 2017 Week 45th Sunday
    November 04th, 2017 Week 44th Saturday
    November 03rd, 2017 Week 44th Friday
    Asp.net core 学习笔记 ( Area and Feature folder structure 文件结构 )
    图片方向 image orientation Exif
    Asp.net core 学习笔记 ( Router 路由 )
    Asp.net core 学习笔记 ( Configuration 配置 )
    qrcode render 二维码扫描读取
  • 原文地址:https://www.cnblogs.com/hankeke/p/maze.html
Copyright © 2011-2022 走看看