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