【OpenJudge 2.5-1792】这绝壁是一道玄学题!【DFS】

首先,按照基本法,我们贴出题目:

描述

一天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啊!都是一个爹生的啊!为什么老二就能过老大就TLE啊喂!

没错挺玄学的

好像就是不能把退出搜索的判断写在循环里,因为我试过很多次都不过,等我写在循环外的时候它就过了(你说玄学不玄学)

啪!出代码!
#include<cstdio>
int x1,y1,x2,y2,k,n,F;
int dx[4]={-1,0,1,0},
    dy[4]={0,-1,0,1};
bool mp[233][233];
void DFS(int x,int y){
    mp[x][y]=1;
    if(F==1)return ;
    if(x==x2&&y==y2){F=1;return;}
    for(int i=0;i<4;i++){
        int tx=x+dx[i],ty=y+dy[i];
        if(F==0&&!mp[tx][ty]&&tx>-1&&ty>-1&&tx<n&&ty<n)
            DFS(tx,ty);
    }
}
int main(){
    scanf("%d",&k);
    for(int i=1;i<=k;i++){
        F=0;
        scanf("%d\n",&n);
        for(int p=0;p<n;p++){
            for(int q=0;q<n;q++){
                char c;
                scanf("%c ",&c);
                if(c==‘.‘)mp[p][q]=0;
                else mp[p][q]=1;
            }
        }
        scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
        if(mp[x1][y1]||mp[x2][y2]){printf("NO\n");continue;}
        DFS(x1,y1);
        if(F==1)printf("YES\n");else printf("NO\n");
    }
} 

一个主程序,一个DFS好像没啥好解释的

而且这题目数据挺水,int就过了不用开祖宗。

时间: 2024-12-17 21:48:54

【OpenJudge 2.5-1792】这绝壁是一道玄学题!【DFS】的相关文章

【OpenJudge 2.5-1700】这还是一道玄学题!【DFS】

描述 在国际象棋棋盘上放置八个皇后,要求每两个皇后之间不能直接吃掉对方.输入无输入.输出按给定顺序和格式输出所有八皇后问题的解(见Sample Output). 样例输出 No. 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 No. 2 1 0 0 0 0 0 0 0 0 0 0 0

每天一道Java题[11]

题目 synchronized怎么实现线程同步?请修改<每天一道Java题[10]>中的MyRunnableThread类以解决三个线程都获取到10的问题. 解答 方法一: 采用synchronized关键字包裹需要保证线程安全的代码块,来实现线程同步.语法格式为: Synchronized(expression){ //需同步的代码 } <每天一道Java题[10]>中的MyRunnableThread类修改为: package me.huangzijian; public cl

每天一道Java题[3]

问题 为什么在重写equals()方法的同时,必须重写hashCode()方法? 解答 在<每天一道Java题[2]>中,已经对hashCode()能否判断两个对象是否相等做出了解释.equals()方法与hashCode()方法的关系如下: 如果两个对象的hashCode()返回值不一样,则equals()返回的结果必为false. 如果两个对象的hashCode()返回值一样的时候,equals()返回的结果未知. 如果两个对象的equals()返回的结果为true,则两个对象的hashC

一天一道算法题---6.26---二分查找

感谢微信平台---一天一道算法题----每天多一点进步-- 好累啊  现在在用win7自带的输入法 打起来真麻烦 快点把这2天的搞完就重装了 还是直接来源于----〉 待字闺中 分析 给定一个数组A,其中有一个位置被称为Magic Index,含义是:如果i是Magic Index,则A[i] = i.假设A中的元素递增有序.且不重复,请给出方法,找到这个Magic Index.更进一步,当A中允许有重复的元素,该怎么办呢? 没有重复元素的情况 一些同学在遇到这个题目的时候,往往会觉得比较简单.

一天一道算法题--6.25--无定义

感谢微信平台---一天一道算法题--每天多一点进步---- 其实今天我接下去补上的几题都来自---待字闺中 所以我就原封不动的将它的题目与分析搬过来了 原题 给定一个数组,我们可以找到两个不相交的.并且是连续的子数组A和B,A中的数字和为sum(A), B中的元素和为sum(B).找到这样的A和B,满足sum(A) - sum(B)的绝对值是最大的. 例如:[2, -1 -2, 1, -4, 2, 8]划分为A=[-1, -2, 1, -4], B=[2, 8], 最大的值为16 分析 如果没有

一天一道算法题---6.27---二分图

感谢微信平台---一天一道算法题---每天多一点进步--- Ah... last... 也很晚了 快2点半了 C罗也告别这届世界杯了  主要还是输给德国太多球了 美国也没赢 唉 还是来源于----> 待字闺中 原题 大家都知道facebook用户都是双向的好友,a是b的好友,那么b一定是a的好友,现在给定一个用户列表,其中有些用户是好友,有些不是,请判断,这些用户是否可以划分为两组,并且每组内的用户,互相都不是好友.如果能,请给出这个划分. 例子1: 用户:{1, 2, 3} 好友关系:1-2,

前端面试的一道算法题

(使用canvas解答) 下面说一个跟前端有点相关并且有点趣的一道算法题. 题目: 平面上有若干个不特定的形状,如下图所示.请写程序求出物体的个数,以及每个不同物体的面积. 分析 想要知道有多少个图形,想到的就是先获取图片中的每一个像素点然后判获取像素点的背景颜色(RGBA).想要获得图片中的每一个像素点,那就可以联想到使用h5的canvas.如下: 菜鸟教程中canvas的getimagedata方法http://www.runoob.com/tags/canvas-getimagedata.

一天一道算法题--6.19--二分搜索

感谢微信平台---一天一道算法题---每天多一点进步 这是昨天的 只贴下题目 == 再把今天的也是一样处理了   这2天 不想写 可能晚上会有改变吧.. problem: 给定一个最多包含40亿个随机排列的32位 二进制的无符号整数 找出不在文件中的数.显然 由于 2^32=4294967196大于4亿 所以缺少的数不止一个 现限制只能使用几个外部的临时文件和仅几百个字节的内存. ****************************** 过了明天 就没事了 =-= 一天一道算法题--6.19

一道推理题

题目:http://115.28.76.232/problem?pid=1115 题意:初始给定两个完美数1和3,如果都是完美数,那么也是完美数.现在给定一个数,判断 它是否是完美数. 分析:嗯,这道题Mayuyu有两种方法,第一种方法是按照题意有,那么我们进行递归直接判 断.这样做的时间复杂度很高,通过打表对一些数的观察发现,只需要看这个数是否只由3和5组成. 打表代码: #include <iostream> #include <string.h> #include <s