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

hdu - 1195 Open the Lock (bfs)

时间:2015-05-28 21:25:36      阅读:183      评论:0      收藏:0      [点我收藏+]

标签:

http://acm.hdu.edu.cn/showproblem.php?pid=1195

这道题虽然只是从四个数到四个数,但是状态很多,开始一直不知道怎么下手,关键就是如何划分这些状态,确保每一个状态都能遍历到。

得到四个数之后,分三种情况处理,每次改变一个数之后都要加入队列,最先输出的就是步数最少。

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <queue>
 4 using namespace std;
 5 
 6 struct point
 7 {
 8     int f[5];
 9     int step;
10 }s,e;
11 int vis[15][15][15][15];
12 void bfs()
13 {
14     memset(vis,0,sizeof(vis));
15     queue<point>que;
16     s.step=0;
17     que.push(s);
18     vis[s.f[0]][s.f[1]][s.f[2]][s.f[3]]=1;
19     while(!que.empty())
20     {
21         point t=que.front(); que.pop();
22       //  printf("%d %d %d %d %d\n",t.f[0],t.f[1],t.f[2],t.f[3],t.step);
23         if(t.f[0]==e.f[0]&&t.f[1]==e.f[1]&&t.f[2]==e.f[2]&&t.f[3]==e.f[3]) {printf("%d\n",t.step);return;}
24         for(int i=0;i<4;i++)
25         {
26             s=t;
27             if(s.f[i]==9) s.f[i]=1;
28             else s.f[i]++;
29             if(!vis[s.f[0]][s.f[1]][s.f[2]][s.f[3]])
30             {
31                 vis[s.f[0]][s.f[1]][s.f[2]][s.f[3]]=1;
32                 s.step++;
33                 que.push(s);
34             }
35         }
36         for(int i=0;i<4;i++)
37         {
38             s=t;
39             if(s.f[i]==1) s.f[i]=9;
40             else s.f[i]--;
41             if(!vis[s.f[0]][s.f[1]][s.f[2]][s.f[3]])
42             {
43                 vis[s.f[0]][s.f[1]][s.f[2]][s.f[3]]=1;
44                 s.step++;
45                 que.push(s);
46             }
47         }
48         for(int i=0;i<3;i++)
49         {
50             s=t;
51             s.f[i]=t.f[i+1],s.f[i+1]=t.f[i];
52             if(!vis[s.f[0]][s.f[1]][s.f[2]][s.f[3]])
53             {
54                 vis[s.f[0]][s.f[1]][s.f[2]][s.f[3]]=1;
55                 s.step++;
56                 que.push(s);
57             }
58         }
59     }
60 }
61 int main()
62 {
63    // freopen("a.txt","r",stdin);
64     int t;
65     char s1[6],s2[6];
66     scanf("%d",&t);
67     getchar();
68     while(t--)
69     {
70         scanf("%s%s",s1,s2);
71        // printf("%s %s\n",s1,s2);
72         for(int i=0;i<4;i++)
73         {
74             s.f[i]=s1[i]-0;
75             e.f[i]=s2[i]-0;
76         }
77         bfs();
78     }
79     return 0;
80 }

 

hdu - 1195 Open the Lock (bfs)

标签:

原文地址:http://www.cnblogs.com/nowandforever/p/4536893.html

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