计蒜客 密码锁(BFS)

计蒜客 密码锁(BFS)

https://www.jisuanke.com/course/1797/121114

 

Description

现在一个紧急的任务是打开一个密码锁。密码由四位数字组成,每个数字从 1 到 9 进行编号。每次可以对任何数字加 1 或减 1。当将9加 1 时,数字将变为1,当1减 1 的时,数字将变为9。您也可以与邻居交换数字,每一个行动记做一步。现在你的任务是使用最小的步骤来打开锁。
注意:最左边的数字不是最右边数字的邻居。

Input

第一行输入四位数字,表示密码锁的初始状态。

第二行输入四位数字,表示开锁的密码。

Output

输出一个整数,表示最小步骤。

样例输入

1234
2144

样例输出

2 

 

这道题最开始想不到用搜索来做。

不过这种题目还是很容易使用bfs来完成。

 

对于这道题目我们采用的标记方法和平时的标记也不太一样,我们是标记我们到达过的状态。

我们可以就是通过四维数组来完成标记,把由4个数字组成的一组密码记为一种状态,即:当密码为abcd时,对应的标记就应该记为vis[a][b][c][d]=1。

每次我们可以的操作有三种,第一种对于四位数字中的某一位加一,第二种对于四位数字中的某一位减一,第三种对于四位数字进行交换。

 

 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <iostream>
 4 #include <string>
 5 #include <math.h>
 6 #include <algorithm>
 7 #include <vector>
 8 #include <stack>
 9 #include <queue>
10 #include <set>
11 #include <map>
12 #include <sstream>
13 const int INF=0x3f3f3f3f;
14 typedef long long LL;
15 using namespace std;
16 
17 struct node
18 {
19     int num[4];
20     int step;
21 }first,last;
22 int vis[11][11][11][11];
23 
24 void BFS()
25 {
26     queue<node> qe;
27     node t;
28     t=first;
29     qe.push(t);
30     vis[t.num[0]][t.num[1]][t.num[2]][t.num[3]]=1;
31     while(!qe.empty())
32     {
33         t=qe.front();
34         qe.pop();
35         if(t.num[0]==last.num[0]&&t.num[1]==last.num[1]&&t.num[2]==last.num[2]&&t.num[3]==last.num[3])
36         {    //BFS出口 
37             printf("%d\n",t.step);
38             return ;
39         }
40         for(int i=0;i<4;i++)//+1 
41         {
42             node next=t;
43             next.num[i]++;
44             if(next.num[i]==10) next.num[i]=1;
45             if(!vis[next.num[0]][next.num[1]][next.num[2]][next.num[3]])
46             {
47                 vis[next.num[0]][next.num[1]][next.num[2]][next.num[3]]=1;
48                 next.step++;
49                 qe.push(next);
50             }
51         }
52         for(int i=0;i<4;i++)//-1
53         {
54             node next=t;
55             next.num[i]--;
56             if(next.num[i]==0) next.num[i]=9;
57             if(!vis[next.num[0]][next.num[1]][next.num[2]][next.num[3]])
58             {
59                 vis[next.num[0]][next.num[1]][next.num[2]][next.num[3]]=1;
60                 next.step++;
61                 qe.push(next);
62             }
63         }
64         for(int i=0;i<3;i++)//交换 
65         {
66             node next=t;
67             swap(next.num[i],next.num[i+1]);
68             if(!vis[next.num[0]][next.num[1]][next.num[2]][next.num[3]])
69             {
70                 vis[next.num[0]][next.num[1]][next.num[2]][next.num[3]]=1;
71                 next.step++;
72                 qe.push(next);
73             }
74         }    
75     }
76 }
77 
78 int main()
79 {
80     #ifdef DEBUG
81     freopen("sample.txt","r",stdin);
82     #endif
83     
84     char str1[5];
85     char str2[5];
86     scanf("%s %s",str1,str2);
87     for(int i=0;i<4;i++)
88     {
89         first.num[i]=str1[i]-'0';
90         last.num[i]=str2[i]-'0';
91     }
92     BFS();
93     
94     return 0;
95 }

 

 

-

posted @ 2020-01-12 01:15  jiamian22  阅读(757)  评论(0编辑  收藏  举报