走迷宫(三):在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)函 ...
随机推荐
- JAVA 之 JSTL
一.什么是JSTL JSP标准标签库(JSTL)是一个JSP标签集合,它封装了JSP应用的通用核心功能. JSTL支持通用的.结构化的任务,比如迭代,条件判断,XML文档操作,国际化标签,SQL标签. ...
- XEP-0198:流管理
------------恢复内容开始------------ 原文来自:https://xmpp.org/extensions/xep-0198.html,只翻译了技术方面的内容. 摘要:这个规范定义 ...
- MFC之动态调用自己写的类库中的类的成员方法
第一步:创建一个要调用的类库 如果是MFC程序使用,可以创建一个MFC的类库,不过依然可以创建一个win32类库.我所知道的,MFC的类库可以分为常规MFC DLL和MFC扩展DLL关于它们之间的区别 ...
- JS面向对象编程之对象
在AJAX兴起以前,很多人写JS可以说都是毫无章法可言的,基本上是想到什么就写什么,就是一个接一个的函数function,遇到重复的还得copy,如果一不小心函数重名了,还真不知道从何开始查找错误,因 ...
- du命令、df命令、磁盘分区
df:汇报文件系统的磁盘使用空间[root@localhost ~]# df文件系统 1K-块 已用 可用 已用% 挂载点/dev/sda3 29140072 1022920 28117152 4% ...
- keep-alive的深入理解与使用(配合router-view缓存整个路由页面)
原文链接: 点我 在搭建 vue 项目时,有某些组件没必要多次渲染,所以需要将组件在内存中进行‘持久化’,此时 <keep-alive> 便可以派上用场了. <keep-alive& ...
- Codeforce 1311A Add Odd or Subtract Even
Add Odd or Subtract Even time limit per test2 seconds memory limit per test256 megabytes inputstanda ...
- bzoj4318 OSU!和bzoj 3450 Tyvj1952 Easy
这俩题太像了 bzoj 3450 Tyvj1952 Easy Description 某一天WJMZBMR在打osu~~~但是他太弱逼了,有些地方完全靠运气:( 我们来简化一下这个游戏的规则 有n次点 ...
- mysql5.7 修改密码,修改权限
1.修改数据库对指定用户和ip权限 a. IP为192.168.0.1的用户jack拥有对数据库datebase的表table的 增删改查权限, ,连接密码为password grant select ...
- 软件——IDEA主题美化
前言 IntelliJ IDEA主要用于支持 Java.Scala.Groovy 等语言的开发工具,同时具备支持目前主流的技术和框架,擅长于企业应用.移动应用和 Web 应用的开发. IntelliJ ...