計蒜客 密碼鎖(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 }

 

 

 

 

-


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM