openjudge 迷宫

迷宫

总时间限制:  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 
#include 
#include 
#include 


using namespace std; //感觉真是标准的DFS,我刚学,想起了这道题,于是就把它AC出来了。
char a[110][110];    //迷宫,根据题目要求,这么大足够了。使用DFS也不会超时
int pa[110][110];   //0 1 2  标记位置如果是0,代表没走过的位置;如果是1,代表走过的位置;如果是2,代表死胡同(这里不仅仅是上下左右有三个方向都是墙的死胡同,墙的位置还可以是走过的位置)
int zx[4]={1,-1,0,0},zy[4]={0,0,1,-1};  //代表坐标的增量,上下左右
int n,Flag;                             //n代表地图的规模,Flag则是用来标记是否能够走到终点
int ans[101];                           //这个题目要求最后统一输出结果,一次用一个数组储存answer


void DFS(int x1,int y1,int x2,int y2)   //DFS
{
    if(x1==x2&&y1==y2)
    {
        //cout<<"YES"<>cas;
    for(i=0;i>n;
        for(j=1;j<=n;j++)
        {
            for(k=1;k<=n;k++)
                cin>>a[j][k];
            getchar();
        }
        cin>>x1>>y1>>x2>>y2;
        //print();                               注释的代码都是用来Debug的
        DFS(x1+1,y1+1,x2+1,y2+1);
        //cout<



你可能感兴趣的:(ACM练习题,搜索)