Tempter of the Bones

原题:hdoj 1010

原题大意

又是走迷宫的题目,不过这题有点不一样,因为要求狗狗要在T时刻恰好走到D处.

算法分析

明显dfs,不过直接深搜很快就会发现超时了,所以一定得剪枝,百度了下,除了剩余最短步数大于剩余时间外还有一个奇偶剪枝.
奇偶剪枝

程序代码

#include <iostream>
#include <math.h>
#include <memory.h>
using namespace std;
int dx[]={0,0,1,-1};
int dy[]={1,-1,0,0};
int n,m,t;//对应N,M,T 
char maze[7][7];//迷宫 
bool used[7][7];
struct Point{
    int x,y;
};
Point start,door;
int flag;
void dfs(int x,int y,int time)
{

    if(flag) return ;//如果找到就return!否则容易超时     
    if(time>t) return;
    if(x==door.x&&y==door.y&&time==t) 
    {
        flag=1;
        return ;
    }
    for(int i=0;i<4;i++)
    {
        Point tt;
        tt.x=x+dx[i];
        tt.y=y+dy[i];
        if(tt.x<0||tt.y<0||tt.x>=n||tt.y>=m) continue;
        if(maze[tt.x][tt.y]=='X') continue;
        if(!used[tt.x][tt.y])
        {
            used[tt.x][tt.y]=1;
            dfs(tt.x,tt.y,time+1);    
            used[tt.x][tt.y]=0;
        }    
    }
    return ;
}
int main()
{
    while(scanf("%d%d%d",&n,&m,&t)&&n&&m&&t)
    {
        for(int i=0;i<n;i++)
                scanf("%s",maze[i]);
        for(int i=0;i<n;i++)

            for(int j=0;j<m;j++)
                {
                    if(maze[i][j]=='S')
                        {
                            start.x=i;
                            start.y=j;
                        }        
                    else if(maze[i][j]=='D')
                        {
                            door.x=i;
                            door.y=j;
                        }
                }
    if(abs(start.x-door.x)+abs(start.y-door.y)>t||(start.x+start.y+door.x+door.y+t)%2==1)//剪枝
    {
        printf("NO\n");
        continue;
    }
    memset(used,0,sizeof(used));
    flag=0;
    used[start.x][start.y]=1;
    dfs(start.x,start.y,0);
    if(flag) printf("YES");
    else printf("NO");
    printf("\n");
    }
    return 0;
}