首页 > 代码库 > HDU 1010 Tempter of the Bone

HDU 1010 Tempter of the Bone

dfs+剪枝

题意是说一只狗要逃出迷宫,但是必须在某个时间点刚好到出口。


开始裸了一个dfs,TLE。。。剪枝没有啥思路。本来想用bfs先判能否到达,感觉不靠谱。


然后看Discuss,了解了一个奇偶性剪枝。

   0 1 0 1 0 1 0 1 0
   1 0 1 0 1 0 1 0 1
   0 1 0 1 0 1 0 1 0
   1 0 1 0 1 0 1 0 1
   0 1 0 1 0 1 0 1 0
   1 0 1 0 1 0 1 0 1

0->1 和 1->0 都是奇数

0->0 和 1->1 都是偶数。


#include<cstdio>
#include<cstring>
#include<string>
#include<queue>
#include<algorithm>
#include<map>
#include<stack>
#include<iostream>
#include<list>
#include<set>
#include<vector>
#include<cmath>

#define INF 0x7fffffff
#define eps 1e-8
#define LL long long
#define PI 3.141592654
#define CLR(a,b) memset(a,b,sizeof(a))
#define FOR(i,a,n) for(int i= a;i< n ;i++)
#define debug puts("==fuck==")
#define acfun std::ios::sync_with_stdio(false)

#define SIZE 1000+10
using namespace std;

int xx[]={0,0,-1,1};
int yy[]={-1,1,0,0};
int n,m,T;
char g[10][10];
int endx,endy;
bool vis[10][10];
bool flag;
void dfs(int x,int y,int t)
{
    if(flag)return;

    int tmp=(T-t)-abs(endx-x)-abs(endy-y);
    if(tmp<0||tmp&1)return;

    if(g[x][y]=='D'&&t==T)
        flag=1;
    else
    {
        FOR(k,0,4)
        {
            int i=x+xx[k];
            int j=y+yy[k];
            if(i<0||j<0||i>=n||j>=m||g[i][j]=='X'||vis[i][j])
                continue;
            vis[i][j]=1;
            dfs(i,j,t+1);
            vis[i][j]=0;
        }
    }
}

int main()
{
    //freopen("test","w",stdout);
    while(~scanf("%d%d%d",&n,&m,&T))
    {
        if(!n&&!m&&!T)return 0;
        char str[11];
        int x=0,y=0;
        FOR(i,0,n)
        {
            scanf("%s",str);
            FOR(j,0,m)
            {
                g[i][j]=str[j];
                if(g[i][j]=='S')
                    x=i,y=j;
                else if(g[i][j]=='D')
                    endx=i,endy=j;
            }
        }
        CLR(vis,0);
        flag=0;
        vis[x][y]=1;
        dfs(x,y,0);
        if(flag)puts("YES");
        else puts("NO");
    }
}


HDU 1010 Tempter of the Bone