HDOJ/HDU Tempter of the Bone(深搜+奇偶性剪枝)

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;
}
时间: 2024-09-07 15:11:35

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

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

Problem Description Angel was caught by the MOLIGPY! He was put in prison by Moligpy. The prison is described as a N * M (N, M <= 200) matrix. There are WALLs, ROADs, and GUARDs in the prison. Angel's friends want to save Angel. Their task is: approa

HDOJ/HDU 1015 Safecracker(深搜)

Problem Description === Op tech briefing, 2002/11/02 06:42 CST === "The item is locked in a Klein safe behind a painting in the second-floor library. Klein safes are extremely rare; most of them, along with Klein and his factory, were destroyed in Wo

hdu 1010 Tempter of the Bone

hdu 1010 的传送门 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

acm-邻接矩阵能进行深搜么。现在会邻接表的深搜,还用把邻接矩阵转化为邻接表吗

问题描述 邻接矩阵能进行深搜么.现在会邻接表的深搜,还用把邻接矩阵转化为邻接表吗 邻接矩阵如果能进行的话.麻烦大神给点代码啊.小白..如题...... 解决方案 void dfs(int i){ visited[i]=1; for(int j=0;j<n;j++){ if(G[i][j]==1&&visited[j]==0){ dfs(j); } } } 解决方案二: 这是用邻接矩阵求最小生成树的,题主看下能否帮的上忙,如果能帮的上,希望可以采纳 #include #include

c++-UVa1374快速幂运算迭代深搜法 ,C++初学者,求优化方法

问题描述 UVa1374快速幂运算迭代深搜法 ,C++初学者,求优化方法 这是我的代码,优化过几次,但是还是很慢很慢,求大神给优化途经,就是在我的代码的进行优化 #include #include #include #include using namespace std; bool search(int,set&,int dep,int); int MAX=1; int tempMax; int main() { sets;int n; for(n=2;n!=1000;++n) { s.cle

穷举搜索:回溯与深搜

计算机常用算法大致有两大类,一类叫蛮力算法,一类叫贪心算法,前者常使用的手段就是搜索,对全部解空间进行地毯式搜索,直到找到指定解或最优解. [建立解空间] 问题的解应该如何描述,如何建立?借助图论的思想,我们可以用图来描述,图的定义为G,由顶点集和边集构成,顶点即实实在在的数 据.对象,而边可以抽象为关系,即顶点间的关系,这种关系不一定非要在数据结构上表现出来,用数据结构的语言来描述,如果关系是一对一,则为线性表,如果 关系是一对多,则为树,如果关系是多对多,则为图,如果完全没有关系,则为集合.

HDOJ/HDU 1372 Knight Moves(经典BFS)

Problem Description A friend of you is doing research on the Traveling Knight Problem (TKP) where you are to find the shortest closed tour of knight moves that visits each square of a given set of n squares on a chessboard exactly once. He thinks tha

深搜算法实例:老鼠走迷宫(一)

这个是简单的深搜,应该输入深搜中抛砖型的,联系下代码,回顾一下深搜的思想. 本题的要求是,在开始点(1,1)和终点(5,5)放一只老鼠,让老鼠找到一条路径走出去(暂时不考虑最短路径),找到后输出路径. 最简单的想法就是对于上下左右四个进行刨根型的搜索,找到就返回输出,进入死胡同了就原路返回,找最近的有其他路径的点,继续搜索,知道找出为止. 下面是代码部分. #include <stdio.h> #include <stdlib.h> #define SUCCESS 1 #defin

ZOJ(ZJU) 1002 Fire Net(深搜)

Suppose that we have a square city with straight streets. A map of a city is a square board with n rows and n columns, each representing a street or a piece of wall. A blockhouse is a small castle that has four openings through which to shoot. The fo