HDU 1010(DFS+剪枝)

一道简单深搜题,重点是如何剪枝,不然会T到怀疑人生........

题目大意就是问能否恰好在规定的步数一刹那到达规定的地点,由此而进行思考,如果当前位置
到终点位置,在最理想无障碍地直接到所需要的步数num如果都小于剩余规定能走的步数,那岂
不适肯定不能到了。反之,则想假如已经在目的地旁边了,但是规定能走的步数还有3步,那我
只要绕一下,在理想无障碍的条件下不就能到了....因此由此就是对奇偶的判断了:当前位置坐标
到终点的最短步数一定与题目规定剩余能走的步数,同奇同偶!!!

 

AC代码(写的时候思维有点混乱,代码略丑):

 

#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
int m,n,step,temp,FF,num,ans,ex,ey,sx,sy;
char map[10][10];
int vis[10][10],dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
void dfs(int x,int y,int t)
{
    /*if(step==t&&!vis[x][y]&&map[x][y]=='D')  FF=1;
    if(FF)  return ;*/
    if(FF==1)  return ;
    if(step==t&&x==ex&&y==ey)  {FF=1;return;}
    int num=abs(x-ex)+abs(y-ey);
    if(num>step-t||(num+step-t)%2!=0)  return ;
    for(int i=0;i<4;i++)
    {
        int nx=x+dir[i][0],ny=y+dir[i][1];
        if(map[nx][ny]!='X'&&!vis[nx][ny]&&nx>=0&&nx<m&&ny>=0&&ny<n)
        {
            vis[nx][ny]=1;
            dfs(nx,ny,t+1);
            vis[nx][ny]=0;  //vital
        }
    }
}
int main()
{
    while(scanf("%d%d%d",&m,&n,&step),m+n+step!=0)
    {
        FF=0,ans=0;
        memset(vis,0,sizeof(vis));
        for(int i=0;i<m;i++)
        {
            scanf("%s",map[i]);
            for(int j=0;j<n;j++)
            {
                if(map[i][j]=='S')  sx=i,sy=j;
                if(map[i][j]=='D')  ex=i,ey=j;
                if(map[i][j]=='X')  ans++;

            }
        }
        if(n*m-ans-1<step)  {puts("NO");continue;}
        vis[sx][sy]=1;
        dfs(sx,sy,0);
        if(FF)  puts("YES");
        else  puts("NO");
    }
    return 0;
}
View Code

 

posted on 2017-07-18 09:13  欲儿很轻狂  阅读(107)  评论(0编辑  收藏  举报

导航