走迷宫(三):在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[][];
int vis[][]; //(新增)访问标记的数组
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<||x>=N||y<||y>=M)
{
return ;
} if(flag)
{
return;
}
if(map[x][y]=='D'&&dep==T)
{
flag=;
return ;
} int temp=abs(x-dx)+abs(y-dy); //(新增)奇偶剪枝
temp=T-temp-dep;
if(temp&) //if(走不下去了)
{
return;
} //枚举下一种情况,DFS(...,dep+1);
if(!vis[x-][y]&&map[x-][y]!='X') //(新增)if(下一个点满足的情况)
{
vis[x-][y]=;
dfs(x-,y,dep+);
vis[x-][y]=;
}
if(!vis[x+][y]&&map[x+][y]!='X') //(新增)if(下一个点满足的情况)
{
vis[x+][y]=;
dfs(x+,y,dep+);
vis[x+][y]=;
}
if(!vis[x][y-]&&map[x][y-]!='X') //(新增)if(下一个点满足的情况)
{
vis[x][y-]=;
dfs(x,y-,dep+);
vis[x][y-]=;
}
if(!vis[x][y+]&&map[x][y+]!='X') //(新增)if(下一个点满足的情况)
{
vis[x][y+]=;
dfs(x,y+,dep+);
vis[x][y+]=;
} } int main()
{
while(cin>>N>>M>>T)
{
if(N==&&M==&&T==)
{
break;
} k=;
memset(vis,,sizeof(vis)); //(新增)访问标记数组的初始化。 for(int i=;i<N;i++)
{
for(int j=;j<M;j++)
{
cin>>map[i][j];
if(map[i][j]=='S')
{
sx=i;
sy=j;
vis[i][j]=; //(新增)给起点作“已访”标记
}
if(map[i][j]=='D')
{
dx=i;
dy=j;
} if(map[i][j]=='X')
{
k++; //(新增)记录障碍物的个数
}
}
} flag=; //(新增)初始状态为false; if(N*M-k->=T) //(新增)T+k+1(起点S的位置)必须 <= N*M(总的格子数)
{
dfs(sx,sy,);
} if(flag)
{
cout<<"YES\n";
}
else
{
cout<<"NO\n";
} }
}
走迷宫(三):在XX限制条件下,是否走得出。的更多相关文章
- 走迷宫(二):在XX限制条件下,是否走得出
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1728 解题方法:BFS+访问数组vis[][]; 给你起点位置和终点位置,让你判断能不能到达,并且拐弯 ...
- P1103 走迷宫三
题目描述 大魔王抓住了爱丽丝,将她丢进了一口枯井中,并堵住了井口. 爱丽丝在井底发现了一张地图,他发现他现在身处一个迷宫当中,从地图中可以发现,迷宫是一个N*M的矩形,爱丽丝身处迷宫的左上角,唯一的出 ...
- 走迷宫(用队列bfs并输出走的路径)
#include <iostream> #include <stack> #include <string.h> #include <stdio.h> ...
- 一本通之 一堆迷宫 (Dungeon Master&走出迷宫&走迷宫)
一本通在线崩溃....... . 有图有真相 这是个三维迷宫,其实和二位迷宫差不多,只是方向多加了2个. 但这个题的输入十分恶心,一度被坑的用cin.ignore(),但还是不过... 它的正确输入方 ...
- 洛谷——P1238 走迷宫
P1238 走迷宫 题目描述 有一个m*n格的迷宫(表示有m行.n列),其中有可走的也有不可走的,如果用1表示可以走,0表示不可以走,文件读入这m*n个数据和起始点.结束点(起始点和结束点都是用两个数 ...
- 用Q-learning算法实现自动走迷宫机器人
项目描述: 在该项目中,你将使用强化学习算法,实现一个自动走迷宫机器人. 如上图所示,智能机器人显示在右上角.在我们的迷宫中,有陷阱(红色炸弹)及终点(蓝色的目标点)两种情景.机器人要尽量避开陷阱.尽 ...
- 数据结构之递归Demo(走迷宫)(八皇后)(汉诺塔)
递归 顾名思义,递归就是递归就是递归就是递归就是递归......就是递归 Google递归:
- 第四周PTA笔记 好吃的巧克力+特殊的翻译+下次一定(续)+走迷宫
好吃的巧克力 超市正在特价售卖巧克力,正好被贪吃的Lucky_dog看见了. 巧克力从左到右排成一排,一共有N个,M种. 超市有一个很奇怪的规定,就是你在购买巧克力时必须提供两个数字a和b,代表你要购 ...
- C语言动态走迷宫
曾经用C语言做过的动态走迷宫程序,先分享代码如下: 代码如下: //头文件 #include<stdio.h> #include<windows.h>//Sleep(500)函 ...
随机推荐
- hdu3033 I love sneakers! 分组背包变形(详解)
这个题很怪,一开始没仔细读题,写了个简单的分组背包交上去,果不其然WA. 题目分析: 分组背包问题是这样描述的:有K组物品,每组 i 个,费用分别为Ci ,价值为Vi,每组物品是互斥的,只能取一个或者 ...
- Springboot中,Tomcat启动war包的流程
将一个SpringBoot项目,打成war包 <!-- 1. 修改POM依赖 --> <dependency> <groupId>org.springframewo ...
- Spark 源码系列(六)Shuffle 的过程解析
Spark 大会上,所有的演讲嘉宾都认为 shuffle 是最影响性能的地方,但是又无可奈何.之前去百度面试 hadoop 的时候,也被问到了这个问题,直接回答了不知道. 这篇文章主要是沿着下面几个问 ...
- C++课程设计详解-12306的模拟实现
目录 设计思路... 3 思路分析:.... 3 数据组织:.... 4 具体功能实现过程... 4 管理端具体功能实现:.... 4 用户端具体功能实现:.... 5 调试截图和调试过程中遇到的问题 ...
- USACO Training Section 1.1 坏掉的项链Broken Necklace
题目描述 你有一条由N个红色的,白色的,或蓝色的珠子组成的项链(3<=N<=350),珠子是随意安排的. 这里是 n=29 的二个例子: 第一和第二个珠子在图片中已经被作记号. 图片 A ...
- Python安装第三方模块出错 No module named setuptools
在安装 zabbix-alerta 第三方模块时候报错 python setup.py install 此时需要安装 setuptools 模块, 这里用自动化脚本安装 wget https://bo ...
- sshd: no hostkeys available — exiting
在开启SSHD服务时报错.sshd re-exec requires execution with an absolute path用绝对路径启动,也报错如下:Could not load host ...
- 用PHP获取网页上的信息相对于xpath效率低点
用php实现对网页的抓取,及信息的收集,其实就是爬数据,具体实现步骤如下,首先应引入两个文件curl_html_get.php和save_file.php文件,两个文件具体代码是这样的curl_htm ...
- 今天主要做的是Remember Me(记住我)功能的实现
功能就是让网站登录过的人只要不注销,下次打开网站之后直接进入,不用重复登录,此功能主要是session与cookie的配合运用,具体实现是这样的,在登录页面判断并完成登录,然后将所需数据写入sessi ...
- Python实现将网站域名解析为ip地址
起因 因为一些事情,需要将域名解析为ip地址,想到Python作为万能语言,就用Python来实现这个功能 代码 import socket url = 'shiyixirui.cn' res = s ...