走迷宫(三):在XX限制条件下,是否走得出。

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1010

题目前提条件:让你输入一个数组,包含一个起点S,一个终点D,一个时间T。(其中X代表墙,.代表此地可行。)

题目要求:在规定的第T秒,问你是否能够走出迷宫。(每走一步耗时1s)。

解题方法:DFS+vis[][]+flag+(新技巧)奇偶剪枝。

#include<iostream>
#include<string.h>
#include<cmath>;
using namespace std;

char map[8][8];
int vis[8][8];  //(新增)访问标记的数组
int N,M,T;
int sx,dx,sy,dy;
int flag;      //(新增)判断状态
int k;         //(新增)记录障碍物的个数

int abs(int a,int b)
{
    if(a<b)
    {
        return b-a;
    }
    else
    {
        return a-b;
    }
}

void dfs(int x,int y,int dep)   //void()函数内使用“return;”表示跳出此函数。
{
    if(dep>T)
    {
        return ;
    }
    if(x<0||x>=N||y<0||y>=M)
    {
        return ;
    }

    if(flag)
    {
        return;
    }
    if(map[x][y]==‘D‘&&dep==T)
    {
        flag=1;
        return ;
    }

    int temp=abs(x-dx)+abs(y-dy); //(新增)奇偶剪枝
    temp=T-temp-dep;
    if(temp&1)                    //if(走不下去了)
    {
        return;
    }

    //枚举下一种情况,DFS(...,dep+1);
   if(!vis[x-1][y]&&map[x-1][y]!=‘X‘)    //(新增)if(下一个点满足的情况)
   {
       vis[x-1][y]=1;
       dfs(x-1,y,dep+1);
       vis[x-1][y]=0;
   }
   if(!vis[x+1][y]&&map[x+1][y]!=‘X‘)   //(新增)if(下一个点满足的情况)
   {
       vis[x+1][y]=1;
       dfs(x+1,y,dep+1);
       vis[x+1][y]=0;
   }
   if(!vis[x][y-1]&&map[x][y-1]!=‘X‘)   //(新增)if(下一个点满足的情况)
   {
       vis[x][y-1]=1;
       dfs(x,y-1,dep+1);
       vis[x][y-1]=0;
   }
   if(!vis[x][y+1]&&map[x][y+1]!=‘X‘)   //(新增)if(下一个点满足的情况)
   {
       vis[x][y+1]=1;
       dfs(x,y+1,dep+1);
       vis[x][y+1]=0;
   }

}

int main()
{
    while(cin>>N>>M>>T)
    {
        if(N==0&&M==0&&T==0)
        {
            break;
        }

        k=0;
        memset(vis,0,sizeof(vis));   //(新增)访问标记数组的初始化。

        for(int i=0;i<N;i++)
        {
            for(int j=0;j<M;j++)
            {
                cin>>map[i][j];
                if(map[i][j]==‘S‘)
                {
                    sx=i;
                    sy=j;
                    vis[i][j]=1;  //(新增)给起点作“已访”标记
                }
                if(map[i][j]==‘D‘)
                {
                    dx=i;
                    dy=j;
                }

                if(map[i][j]==‘X‘)
                {
                    k++;  //(新增)记录障碍物的个数
                }
            }
        }

        flag=0;  //(新增)初始状态为false;

        if(N*M-k-1>=T)       //(新增)T+k+1(起点S的位置)必须 <=   N*M(总的格子数)
        {
            dfs(sx,sy,0);
        }

        if(flag)
        {
            cout<<"YES\n";
        }
        else
        {
            cout<<"NO\n";
        }

    }
}
时间: 2024-10-15 10:07:34

走迷宫(三):在XX限制条件下,是否走得出。的相关文章

走迷宫(用队列bfs并输出走的路径)

#include <iostream> #include <stack> #include <string.h> #include <stdio.h> #include<queue> #include<algorithm> using namespace std; int a[11][11]= { {1,1,1,1,1,1,1,1,1,1},{1,0,0,1,0,0,0,1,0,1}, {1,0,0,1,0,0,0,1,0,1},{1

nyoj306 走迷宫(搜索+二分)

题目306 题目信息 运行结果 本题排行 讨论区 走迷宫 时间限制:1000 ms  |  内存限制:65535 KB 难度:5 描述 Dr.Kong设计的机器人卡多非常爱玩,它常常偷偷跑出实验室,在某个游乐场玩之不疲.这天卡多又跑出来了,在SJTL游乐场玩个不停,坐完碰碰车,又玩滑滑梯,这时卡多又走入一个迷宫.整个迷宫是用一个N * N的方阵给出,方阵中单元格中填充了一个整数,表示走到这个位置的难度. 这个迷宫可以向上走,向下走,向右走,向左走,但是不能穿越对角线.走迷宫的取胜规则很有意思,看

洛谷——P1238 走迷宫

P1238 走迷宫 题目描述 有一个m*n格的迷宫(表示有m行.n列),其中有可走的也有不可走的,如果用1表示可以走,0表示不可以走,文件读入这m*n个数据和起始点.结束点(起始点和结束点都是用两个数据来描述的,分别表示这个点的行号和列号).现在要你编程找出所有可行的道路,要求所走的路中没有重复的点,走时只能是上下左右四个方向.如果一条路都不可行,则输出相应信息(用-l表示无路). 输入输出格式 输入格式: 第一行是两个数m,n(1<m,n<15),接下来是m行n列由1和0组成的数据,最后两行

c++ 走迷宫

题目描述 有一个nm格的迷宫(表示有n行.m列),其中有可走的也有不可走的,如果用1表示可以走,0表示不可以走,文件读入这nm个数据和起始点.结束点(起始点和结束点都是用两个数据来描述的,分别表示这个点的行号和列号).现在要你编程找出所有可行的道路,要求所走的路中没有重复的点,走时只能是上下左右四个方向.如果一条路都不可行,则输出相应信息(用-l表示无路). 请统一用 左上右下的顺序拓展,也就是 (0,-1),(-1,0),(0,1),(1,0) 输入 第一行是两个数n,m( 1 < n , m

ybt 1252 广度优先搜索 走迷宫(二维、最小步数)

1252:走迷宫 时间限制: 1000 ms         内存限制: 65536 KB提交数: 7272     通过数: 3241 [题目描述] 一个迷宫由R行C列格子组成,有的格子里有障碍物,不能走:有的格子是空地,可以走. 给定一个迷宫,求从左上角走到右下角最少需要走多少步(数据保证一定能走到).只能在水平方向或垂直方向走,不能斜着走. [输入] 第一行是两个整数,R和C,代表迷宫的长和宽.( 1≤ R,C ≤ 40) 接下来是R行,每行C个字符,代表整个迷宫. 空地格子用‘.’表示,

NYOJ306 走迷宫(dfs+二分搜索)

题目描述 http://acm.nyist.net/JudgeOnline/problem.php?pid=306 Dr.Kong设计的机器人卡多非常爱玩,它常常偷偷跑出实验室,在某个游乐场玩之不疲.这天卡多又跑出来了,在SJTL游乐场玩个不停,坐完碰碰车,又玩滑滑梯,这时卡多又走入一个迷宫.整个迷宫是用一个N * N的方阵给出,方阵中单元格中填充了一个整数,表示走到这个位置的难度. 这个迷宫可以向上走,向下走,向右走,向左走,但是不能穿越对角线.走迷宫的取胜规则很有意思,看谁能更快地找到一条路

青蛙走迷宫问题(体力值)

题目: 青蛙走迷宫,1代表路通,0代表不通:起点是(0, 0),终点是(0,m - 1);青蛙每次向上走需要消耗体力值为3,向下走不消耗体力值,平走消耗体力值1:根据给定值判断青蛙是否可以根据初始值到达终点,并求出消耗体力值最少的路径: 举例: n = 4, m =4, p = 10(体力值) 4 4 10 1 0 0 1 1 1 0 1 0 1 1 1 0 0 1 1 则结果为:[[0, 0], [1, 0], [1, 1], [2, 1], [2, 2], [2, 3], [1, 3], [

算法:老鼠走迷宫问题

算法:老鼠走迷宫问题(初) [写在前面] 老鼠走迷宫问题的递归实现,是对递归思想的一种应用. [问题描述] 给定一个二维数组,数组中2表示墙壁,0表示通路,由此数组可展示为一个迷宫图.给定入口位置和出口位置,判断之间是否存在通路并显示出走出迷宫的道路. [代码] 对题目的描述部分 int migo[7][7]={ {2, 2, 2, 2, 2, 2, 2}, {2, 0, 0, 0, 0, 0, 2}, {2, 0, 2, 0, 2, 0, 2}, {2, 0, 0, 0, 0, 2, 2},

走迷宫——C++ 算法实现

这两个看了几个不错的走迷宫算法,然后按照自己的方式写了一个实现,代码如下: MyMazeMap.cpp 1 #include <iostream> 2 #include <Windows.h> 3 #include "MazeMap.h" 4 #include "Mazer.h" 5 using namespace std; 6 7 const int SUCCESS = 0; 8 9 int main() 10 { 11 int map[8