Tempter of the Bone HDU - 1010

Tempter of the Bone HDU - 1010

dfs。

几个剪枝:

1.如果当前所用时间加上当前位置到目标的曼哈顿距离之和大于目标时间,那么显然无论如何不能完成。剪掉

2.在搜索前判一下,如果出发位置到目标的曼哈顿距离与目标时间的奇偶性不同,那么显然无论如何不能完成。剪掉

错误原因:未加第二个剪枝,TLE

 1 #include<cstdio>
 2 char s[10][10];
 3 bool ok;
 4 int n,m,t,tx,ty,sx,sy;
 5 int abs(int x)
 6 {
 7     return x>0?x:-x;
 8 }
 9 void dfs(int x,int y,int num)
10 {
11     if(num>t)    return;
12     if(abs(tx-x)+abs(ty-y)+num>t)    return;
13     if(x==tx&&y==ty)
14     {
15         if(num==t)
16         {
17             puts("YES");
18             ok=1;
19         }
20         return;
21     }
22     s[x][y]='X';
23     if(x>1&&s[x-1][y]=='.')    dfs(x-1,y,num+1);
24     if(ok)    return;
25     if(x<n&&s[x+1][y]=='.')    dfs(x+1,y,num+1);
26     if(ok)    return;
27     if(y>1&&s[x][y-1]=='.')    dfs(x,y-1,num+1);
28     if(ok)    return;
29     if(y<m&&s[x][y+1]=='.')    dfs(x,y+1,num+1);
30     if(ok)    return;
31     s[x][y]='.';
32 }
33 int main()
34 {
35     int i,j;
36     scanf("%d%d%d",&n,&m,&t);
37     while(n!=0&&m!=0&&t!=0)
38     {
39         ok=false;
40         for(i=1;i<=n;i++)
41             scanf("%s",s[i]+1);
42         for(i=1;i<=n;i++)
43             for(j=1;j<=m;j++)
44             {
45                 if(s[i][j]=='S')
46                 {
47                     sx=i;sy=j;
48                     s[i][j]='.';
49                 }
50                 else if(s[i][j]=='D')
51                 {
52                     tx=i;ty=j;
53                     s[i][j]='.';
54                 }
55             }
56         if((abs(tx-sx)+abs(ty-sy)-t)%2==0)
57             dfs(sx,sy,0);
58         if(!ok)
59             puts("NO");
60         scanf("%d%d%d",&n,&m,&t);
61     }
62     return 0;
63 }
posted @ 2017-11-08 18:12  hehe_54321  阅读(148)  评论(0编辑  收藏  举报
AmazingCounters.com