Problem Description

The doggie found a bone in an ancient maze, which fascinated him a lot. However, when he picked it up, the maze began to shake, and the doggie could feel the ground sinking. He realized that the bone was a trap, and he tried desperately to get out of this maze.

The maze was a rectangle with sizes N by M. There was a door in the maze. At the beginning, the door was closed and it would open at the T-th second for a short period of time (less than 1 second). Therefore the doggie had to arrive at the door on exactly the T-th second. In every second, he could move one block to one of the upper, lower, left and right neighboring blocks. Once he entered a block, the ground of this block would start to sink and disappear in the next second. He could not stay at one block for more than one second, nor could he move into a visited block. Can the poor doggie survive? Please help him.

Input

The input consists of multiple test cases. The first line of each test case contains three integers N, M, and T (1 < N, M < 7; 0 < T < 50), which denote the sizes of the maze and the time at which the door will open, respectively. The next N lines give the maze layout, with each line containing M characters. A character is one of the following:

‘X’: a block of wall, which the doggie cannot enter;

‘S’: the start point of the doggie;

‘D’: the Door; or

‘.’: an empty block.

The input is terminated with three 0’s. This test case is not to be processed.

Output

For each test case, print in one line “YES” if the doggie can survive, or “NO” otherwise.

Sample Input

4 4 5

S.X.

..X.

..XD

….

3 4 5

S.X.

..X.

…D

0 0 0

Sample Output

NO

YES

题意:

老鼠需要跑出迷宫,在每个位置停留1s,入口是S(老鼠一开始在这里),需要在T时刻正好跑到D位置(出口)。求老鼠能不能成功逃脱。



一开始我没有用剪枝,果断超时。

还有,好久没用c语言A题了,char输入时~回车绞了我半小时的思维。。

奇偶性剪枝有关内容大家可以百度搜下,我就不写了,我是自己推出来的,和有些版本不一样。

#include <stdio.h>
#include <string.h>
char map[10][10];
int df[10][10];
int sx,sy,dx,dy;
int ans,flag,t,x,y;
void dfs(int xd,int yd,int c){
//printf("%d %d %d %d\n",xd,yd,c,flag);
if(xd<0||yd<0){
return;
}
int b=t-c;
if((xd%2==0&&yd%2!=0)||(xd%2!=0&&yd%2==0)){
if(b%2!=0){
if(!((dx%2==0&&dy%2==0)||(dx%2!=0&&dy%2!=0))){
return;
}
}else{
if(!((dx%2!=0&&dy%2==0)||(dx%2==0&&dy%2!=0))){
return;
}
}
}else{
if(b%2==0){
if(!((dx%2==0&&dy%2==0)||(dx%2!=0&&dy%2!=0))){
return;
}
}else{
if(!((dx%2!=0&&dy%2==0)||(dx%2==0&&dy%2!=0))){
return;
}
}
}
if(map[xd][yd]=='X'||df[xd][yd]||flag){
return;
}
if(c>t){
return;
} if(c==t&&dx==xd&&dy==yd){
flag=1;
return;
} df[xd][yd]=1;
dfs(xd-1,yd,c+1);
dfs(xd,yd-1,c+1);
dfs(xd+1,yd,c+1);
dfs(xd,yd+1,c+1);
df[xd][yd]=0;
} int main(){
while(scanf("%d%d%d",&x,&y,&t),x||y||t){
memset(df,0,sizeof(df));
int i,j;
ans=0;
flag=0;
for(i=0;i<10;i++){
for(j=0;j<10;j++){
map[i][j]='X';
}
}
getchar();
for(i=0;i<x;i++){
for(j=0;j<y;j++){
scanf("%c",&map[i][j]);
if(map[i][j]=='S'){
sx=i;sy=j;
}else if(map[i][j]=='D'){
dx=i;dy=j;ans++;
}else if(map[i][j]=='.'){
ans++;
}
}
getchar();
}
// printf("%d %d\n",ans,t);
if(ans<t){
printf("NO\n");
continue;
}
dfs(sx,sy,0);
if(flag){
printf("YES\n");
}else{
printf("NO\n");
}
// printf("%d",flag);
}
return 0;
}

HDOJ/HDU Tempter of the Bone(深搜+奇偶性剪枝)的更多相关文章

  1. hdu 1010 Tempter of the Bone 深搜+剪枝

    Tempter of the Bone Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Othe ...

  2. HDOJ/HDU 1242 Rescue(经典BFS深搜-优先队列)

    Problem Description Angel was caught by the MOLIGPY! He was put in prison by Moligpy. The prison is ...

  3. hdu1010 Tempter of the Bone(深搜+剪枝问题)

    Tempter of the Bone Time Limit: / MS (Java/Others) Memory Limit: / K (Java/Others) Total Submission( ...

  4. HDOJ.1010 Tempter of the Bone (DFS)

    Tempter of the Bone [从零开始DFS(1)] 从零开始DFS HDOJ.1342 Lotto [从零开始DFS(0)] - DFS思想与框架/双重DFS HDOJ.1010 Tem ...

  5. 【笔记】「pj复习」深搜——简单剪枝

    深搜--简单剪枝 说在最前面: 因为马上要 NOIP2020 了,所以菜鸡开始了复习qwq. pj 组 T1 ,T2 肯定要拿到满分的,然后 T3 , T4 拿部分分, T3 拿部分分最常见的做法就是 ...

  6. hdu 1010 Tempter of the Bone(深搜+奇偶剪枝)

    Tempter of the Bone Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Othe ...

  7. HDU 1010 Temper of the bone(深搜+剪枝)

    Tempter of the Bone Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other) ...

  8. 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 ...

  9. hdoj 1010 Tempter of the Bone【dfs查找能否在规定步数时从起点到达终点】【奇偶剪枝】

    Tempter of the Bone Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Othe ...

随机推荐

  1. Java编写的C语言词法分析器

    Java编写的C语言词法分析器 这是java编写的C语言词法分析器,我也是参考很多代码,然后核心代码整理起来,放在QQ空间和博客上,目的是互相学习借鉴,希望可以得到高手改进.这个词法分析器实现的功能有 ...

  2. 【DP_背包专题】 背包九讲

    这段时间看了<背包九讲>,在HUST VJUDGE上找到了一个题单,挑选了其中16道题集中做了下,选题全部是HDU上的题,大多是简单题.目前做了点小总结,大概提了下每道题的思路重点部分,希 ...

  3. Kali linux网络配置

    Kali linux 安装完成后,需要对其网络进行配置.使用DHCP服务是配置网卡最简单的方法之一,但渗透测试时通常不会这样做,因为系统会被记录在DHCP服务器的数据库中. 1  动态DHCP方式 配 ...

  4. linux shell 逻辑运算符

    一.逻辑卷标 逻辑卷标 表示意思 1. 关于档案与目录的侦测逻辑卷标! -f 常用!侦测『档案』是否存在 eg: if [ -f filename ] -d 常用!侦测『目录』是否存在 -b 侦测是否 ...

  5. 小笔记(一):ajax传递数组及将ajax返回数据赋值

    当使用ajax传递数据时,有可能传递多个数据,这是使用以下方法传递数据就会显得数据过多且混杂 $.ajax({ type:'post', url:url, data:{data:data,conten ...

  6. C#XML创建与节点对象引用

    我们在创建xml过程中会遇到不同的级别有相同节点的情况.如下面的xml: <?xml version="1.0" encoding="GBK"> & ...

  7. 重构技巧 引入Null对象

    描述:有两个类,学生类和导师类,学生的导师类可能不存在,因此在获取学生导师名字等信息时都要先判断导师名字是否为空.重构后通过一个空导师类来处理导师为空的相应逻辑. Before # introduce ...

  8. STM32库函数开发使用总结

    一.外设常具备的几类寄存器 控制寄存器xxx_CR (Control/Configuration Register): 用来配置.控制响应外设的工作方式,如GPIOx_CRL.AFIO_EXTICR1 ...

  9. Axure草记

    页面控件和DataSet绑定,DataSet和输入控件绑定(通过临时变量) 双击Repeater进入之后,你会发现下面已经默认添加了3行,这代表着,每增加一行将会重复3遍: Repeater可以只是部 ...

  10. uva 1449 - Dominating Patterns

    简单的AC自动机: #include<cstdio> #include<cstring> #include<queue> #define maxn 150005 u ...