hdu 1010 走到终点时刚好花掉所有时间 (DFS + 奇偶性剪枝 )
题意:输入一个n*m的迷宫,和一个T:可以在迷宫中生存的最大时间。S为起点,D为终点。并且,每个格子只能踩一次,且只能维持一秒,然后该块地板就会塌陷。所以你必须每秒走一步,且到D点时,所用时间为T。用深搜。
奇偶性剪枝:如果当前的狗所在的坐标与D的坐标奇偶性不一样,那么狗需要走奇数步。
同理,如果狗所在坐标与D的坐标奇偶性一样,那么狗需要走偶数步数。
也就是说,狗的坐标x、y和对2取余是它的奇偶性,Dxy和对2取余是D的奇偶性。
两个奇偶性一加再对2取余,拿这个余数去与剩下时间对2取余的余数作比较即可。
Sample Input
4 4 5
S.X.
..X.
..XD
....
3 4 5
S.X.
..X.
...D
0 0 0
Sample Output
NO
YES
#include <cstdio>
#include <algorithm>
#include <iostream>
#include <cmath>
#include <vector>
#include <queue> using namespace std; int m,n,t;
char map[][];
int dir[][]={{,},{-,},{,-},{,}};
int ex,ey,sx,sy,ok;//e表示end,终点,s表示start,出发点,ok用来判断是否在规定时间到达 void dfs(int x,int y,int cnt)
{
int i;
if(cnt==t)//剪枝:到时间了符合条件ok=1再退出,不符合条件直接退出。
{
if(ex==x&&ey==y)ok=;
return;
}
if(ok)return;//找到解后还有部分在继续搜索,这条是为了让其它搜索停止 for(i=;i<;i++)
{
int fx=x+dir[i][];
int fy=y+dir[i][];
if(fx>=&&fx<n&&fy>=&&fy<m&&map[fx][fy]!='X')
{
map[fx][fy]='X';
dfs(fx,fy,cnt+);
map[fx][fy]='.'; //回溯
}
}
}
int main()
{
int i,j;
//freopen("in.txt","r",stdin);
while(scanf("%d%d%d",&n,&m,&t))
{
if (m == && n == & t == )
break ; for(i=;i<n;i++)
{
scanf("%s",map[i]);
for(j=;map[i][j]!='\0';j++)
{
if(map[i][j]=='S')
{
sx=i;sy=j;
}
else if(map[i][j]=='D')
{
ex=i;ey=j;
} }
}
if(abs(sx - ex) + abs(sy - ey) > t || (sx +sy+ex+ey+t)% == )//如果步数大于时间 或步数的奇偶性不一致
printf("NO\n");
else
{
ok=;
map[sx][sy]='X';
dfs(sx,sy,);
if(ok)printf("YES\n");
else printf("NO\n");
}
}
return ;
}
hdu 1010 走到终点时刚好花掉所有时间 (DFS + 奇偶性剪枝 )的更多相关文章
- hdu - 1010 Tempter of the Bone (dfs+奇偶性剪枝) && hdu-1015 Safecracker(简单搜索)
http://acm.hdu.edu.cn/showproblem.php?pid=1010 这题就是问能不能在t时刻走到门口,不能用bfs的原因大概是可能不一定是最短路路径吧. 但是这题要过除了细心 ...
- hdu 2157 从a点走到b点刚好k步的方案数是多少 (矩阵快速幂)
n个点 m条路 询问T次 从a点走到b点刚好k步的方案数是多少 给定一个有向图,问从A点恰好走k步(允许重复经过边)到达B点的方案数mod p的值把 给定的图转为邻接矩阵,即A(i,j)=1当且仅当存 ...
- hdu 1372 骑士从起点走到终点的步数 (BFS)
给出起点和终点 求骑士从起点走到终点所需要的步数 Sample Inpute2 e4 //起点 终点a1 b2b2 c3a1 h8a1 h7h8 a1b1 c3f6 f6 Sample OutputT ...
- HDU 1010 Tempter of the Bone(深度+剪枝)
http://acm.hdu.edu.cn/showproblem.php?pid=1010 题意:就是给出了一个迷宫,小狗必须经过指定的步数到达出口,并且每个格子只能走一次. 首先先来介绍一下奇偶性 ...
- hdu 1010:Tempter of the Bone(DFS + 奇偶剪枝)
Tempter of the Bone Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Othe ...
- HDU 1010 (DFS搜索+奇偶剪枝)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1010 题目大意:给定起点和终点,问刚好在t步时能否到达终点. 解题思路: 4个剪枝. ①dep&g ...
- HDU 1010 Tempter of the Bone --- DFS
HDU 1010 题目大意:给定你起点S,和终点D,X为墙不可走,问你是否能在 T 时刻恰好到达终点D. 参考: 奇偶剪枝 奇偶剪枝简单解释: 在一个只能往X.Y方向走的方格上,从起点到终点的最短步数 ...
- HDU 1010 temp of the bone 解题报告 (DFS)
转载大佬的blog,很详细,学到了很多东西 奇偶剪枝:根据题目,dog必须在第t秒到达门口.也就是需要走t-1步.设dog开始的位置为(sx,sy),目标位置为(ex,ey).如果abs(ex-x)+ ...
- hdu 1010 深搜+剪枝
深度搜索 剪枝 还不是很理解 贴上众神代码 //http://blog.csdn.net/vsooda/article/details/7884772#include<iostream> ...
随机推荐
- Java编程思想 学习笔记6
六.访问权限控制 访问控制(或隐藏具体实现)与“最初的实现并不恰当”有关. 如何把变动的事物与保持不变的事物区分开来,这是面向对象设计中的一个基本问题. 为了解决这一问题,Java提供了访问权限修饰词 ...
- JMS学习(八)-ActiveMQ Consumer 使用 push 还是 pull 获取消息
ActiveMQ是一个消息中间件,对于消费者而言有两种方式从消息中间件获取消息: ①Push方式:由消息中间件主动地将消息推送给消费者:②Pull方式:由消费者主动向消息中间件拉取消息.看一段官网对P ...
- Python入门系列教程(一)基础
基础知识 1.变量及类型 2.换行\n 3.输入 password = raw_input("请输入密码:") print '您刚刚输入的密码是:', password 4.格式化 ...
- J - Long Long Message (最长公共子串)
题目链接:https://cn.vjudge.net/contest/283743#problem/J 题目大意:给你两个字符串,问你两个字符串的最长的公共子串. 具体思路:把两个字符串合在一起,然后 ...
- 转载 int和string 类型的互换
https://blog.csdn.net/u012421436/article/details/51386690 不论是在什么语言下编程(除C,因为C是没有string类型的),int与string ...
- mysql 查询优化 ~ 善用profie利器
一 简介:利用profile分析慢语句的过程有助于我们进行语句的优化 二 执行过程 set profiling=1; set profiling=0; 2 执行sql 3 查看过程消耗 三 ...
- cetus系列~ 读写分离具体分析
一 简介:上一章我们讲了cetus的基本安装,这章继续分析cetus 二 分析 1 基本配置 1 开启主从延迟检测需在后端数据库创建库proxy_heart_beat和表tb_heartb ...
- proxysql 系列~审核功能
一 简介:今天我们来探讨下具体的审核功能 二 平台审计功能 一 proxysql 设置 set mysql-eventslog_filename = '/data/ProxySQL/log/sql. ...
- PP图和QQ图
一. QQ图 分位数图示法(Quantile Quantile Plot,简称 Q-Q 图) 统计学里Q-Q图(Q代表分位数)是一个概率图,用图形的方式比较两个概率分布,把他们 ...
- FarBox的建站过程
FarBox的建站过程 本文转自:http://mosir.org/html/y2012/How-to-build-your-website-by-farbox.html 作者: mosir 时间: ...