HDU1010 Tempter of the Bone(DFS+剪枝)

 1 # include <stdio.h>
 2 #include <cstdio>
 3 #include <iostream>
 4 #include <cstring>
 5 #include <cmath>
 6 using namespace std;
 7 char map[8][8];
 8 int visit[8][8];
 9 struct node{
10     int x,y;
11 };
12 int n,m;
13 node Save,Dog;//开始的点和出口位置 
14 int step;//记录总的 步数/时间 
15  
16 int flag = 0;
17 void dfs(int x,int y,int num){
18     visit[x][y] = 1;
19     if(map[x][y] == 'D'){
20         if(num == step)
21             flag = 1;
22         return;
23     }
24     //剪枝 
25     int tmp = step - num - abs(Dog.x-x) - abs(Dog.y-y);
26     if(tmp < 0 || tmp&1){
27         //cout<<x<<" "<<y<<" "<<time<<" "<<abs(c-x)<<" "<<abs(d-y)<<endl;
28         return;
29     }
30     if(num>step){
31         return;
32     }
33     int i;
34     int a[4] = {0,0,1,-1};
35     int b[4] = {-1,1,0,0};
36     for(i=0;i<4;i++){
37         int xx = x+a[i];
38         int yy = y+b[i];
39         if(xx>=0&&xx<n&&yy>=0&&yy<m&&map[xx][yy]!='X'&&!visit[xx][yy]){
40                dfs(xx,yy,num+1);
41                if(flag) return;
42             visit[xx][yy] = 0;
43         }
44     }
45     //return;
46 }
47 int main(){
48     //freopen("in.txt","r",stdin);
49     while(cin>>n>>m>>step){
50         int i,j;
51         if(n==0&&m==0&&step==0) break;
52         for(i=0;i<n;i++){
53             for(j=0;j<m;j++){
54                 cin>>map[i][j];
55                 if(map[i][j]=='S'){
56                     Save.x = i;
57                     Save.y = j;
58                 }
59                 if(map[i][j]=='D'){
60                     Dog.x = i;
61                     Dog.y = j;
62                 }
63             }
64         }
65         
66         flag = 0;
67         memset(visit,0,sizeof(visit));
68         dfs(Save.x,Save.y,0);
69         
70         if(flag==1) cout<<"YES"<<endl;
71         else{
72             cout<<"NO"<<endl;
73         }
74     }    
75 }

 

posted @ 2019-09-21 11:19  清谗  阅读(112)  评论(0编辑  收藏  举报