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 }
-