码迷,mamicode.com
首页 > 其他好文 > 详细

HDU 1010 Tempter of the Bone DFS 简单题 注意剪枝

时间:2015-04-05 23:22:08      阅读:186      评论:0      收藏:0      [点我收藏+]

标签:

题意:一只小狗要刚好在t时刻从起点都到终点,问可不可以。

注意剪枝。

 

技术分享
 1 #include<cstdio>
 2 #include<cstring>
 3 #include<cmath>
 4 using namespace std;
 5 int maze[9][9];
 6 bool vis[9][9];
 7 int n,m,t;
 8 bool ans;
 9 struct Point
10 {
11     int x,y;
12 };
13 int dx[4]={0,0,-1,1};
14 int dy[4]={1,-1,0,0};
15 Point p,e;
16 void dfs(Point cur,int dep)
17 {
18     vis[cur.x][cur.y]=true;
19     if(!ans&&cur.x==e.x&&cur.y==e.y&&dep==t)
20     {
21         ans=true;
22         return ;
23     }
24     if(!ans&&dep>t)
25         return ;
26     for(int i=0;i<4;i++)
27     {
28         Point dcur;
29         dcur.x=cur.x+dx[i];
30         dcur.y=cur.y+dy[i];
31         if(dcur.x<1||dcur.x>n||dcur.y<1||dcur.y>m)
32             continue;
33         if(vis[dcur.x][dcur.y])
34             continue;
35         if(!maze[dcur.x][dcur.y])
36             continue;
37         if(!ans)
38         {
39             dfs(dcur,dep+1);
40             vis[dcur.x][dcur.y]=false;//注意回溯
41         }
42     }
43 }
44 int main()
45 {
46     while(scanf("%d%d%d",&n,&m,&t))
47     {
48         if(n==0&&m==0&&t==0)
49             break;
50         char s[15];
51         for(int i=1;i<=n;i++)
52         {
53             scanf("%s",s+1);
54             for(int j=1;j<=m;j++)
55             {
56                 if(s[j]==X)
57                     maze[i][j]=0;
58                 else if(s[j]==.)
59                     maze[i][j]=1;
60                 else if(s[j]==S)
61                 {
62                     p.x=i;
63                     p.y=j;
64                     maze[i][j]=1;
65                 }
66                 else
67                 {
68                     e.x=i;
69                     e.y=j;
70                     maze[i][j]=1;
71                 }
72             }
73         }
74         ans=false;
75         memset(vis,false,sizeof(vis));
76         int a=abs(e.x+e.y-p.x-p.y);
77         if(a>t)    //剪枝
78             ans=false;
79         else if(a%2!=t%2)   //剪枝
80             ans=false;
81         else
82             dfs(p,0);
83         if(ans)
84             printf("YES\n");
85         else
86             printf("NO\n");
87     }
88     return 0;
89 }
提交代码

 

HDU 1010 Tempter of the Bone DFS 简单题 注意剪枝

标签:

原文地址:http://www.cnblogs.com/-maybe/p/4394923.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!