hdu 1195 Open the Lock(bfs)

Open the Lock

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 5307    Accepted Submission(s): 2360


Problem Description
Now an emergent task for you is to open a password lock. The password is consisted of four digits. Each digit is numbered from 1 to 9. 
Each time, you can add or minus 1 to any digit. When add 1 to '9', the digit will change to be '1' and when minus 1 to '1', the digit will change to be '9'. You can also exchange the digit with its neighbor. Each action will take one step.

Now your task is to use minimal steps to open the lock.

Note: The leftmost digit is not the neighbor of the rightmost digit.
 
Input
The input file begins with an integer T, indicating the number of test cases. 

Each test case begins with a four digit N, indicating the initial state of the password lock. Then followed a line with anotther four dight M, indicating the password which can open the lock. There is one blank line after each test case.
 
Output
For each test case, print the minimal steps in one line.
 
Sample Input
2
1234
2144
 
1111
9999
 
Sample Output
2
4
 
Author
YE, Kai
 
Source
 
Recommend
Ignatius.L   |   We have carefully selected several similar problems for you:  1072 1180 1044 1254 1043 
 
一个非常暴力的bfs,列举所有的数字串,用四维数组就行标记。
 
题意:一个密码箱,第一行输入是初始密码,第二行是正确的密码,每次变化可以一个数字加1(9可以变成1),或者1个数字减1(1可以变成9),或者相邻的两个数字交换位置(1,4不能交换),输出最少多少次从初始密码变为正确密码。
 
附上代码:
 
 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <queue>
 5 using namespace std;
 6 struct node
 7 {
 8     int num[4];
 9     int s;
10 } s1,s2,fs,fe;
11 int ha[10][10][10][10];  //用来标记,是否出现过这四个数字的字符串,1为已出现
12 
13 void BFS()
14 {
15     int i;
16     queue <node> q;
17     while(!q.empty())
18         q.pop();
19     fs.s=0;
20     s1=fs;   //初始化
21     ha[s1.num[0]][s1.num[1]][s1.num[2]][s1.num[3]]=1;
22     q.push(s1);
23     while(!q.empty())
24     {
25         s1=q.front();
26         q.pop();
27         for(i=0; i<4; i++)
28             if(s1.num[i]!=fe.num[i])
29                 break;
30         if(i==4)   //4个数字全部相同,输出结果
31         {
32             printf("%d
",s1.s);
33             return;
34         }
35         for(i=0; i<4; i++)   //加1变化
36         {
37             s2=s1;
38             if(s1.num[i]==9) s2.num[i]=1;
39             else s2.num[i]=s1.num[i]+1;
40             s2.s=s1.s+1;
41             if(!ha[s2.num[0]][s2.num[1]][s2.num[2]][s2.num[3]])
42             {
43                 ha[s2.num[0]][s2.num[1]][s2.num[2]][s2.num[3]]=1;
44                 q.push(s2);
45             }
46         }
47         for(i=0; i<4; i++)  //减1变化
48         {
49             s2=s1;
50             if(s1.num[i]==1) s2.num[i]=9;
51             else s2.num[i]=s1.num[i]-1;
52             s2.s=s1.s+1;
53             if(!ha[s2.num[0]][s2.num[1]][s2.num[2]][s2.num[3]])
54             {
55                 ha[s2.num[0]][s2.num[1]][s2.num[2]][s2.num[3]]=1;
56                 q.push(s2);
57             }
58         }
59         for(i=0; i<3; i++)  //交换
60         {
61             s2=s1;
62             s2.num[i]=s1.num[i+1];
63             s2.num[i+1]=s1.num[i];
64             s2.s=s1.s+1;
65             if(!ha[s2.num[0]][s2.num[1]][s2.num[2]][s2.num[3]])
66             {
67                 ha[s2.num[0]][s2.num[1]][s2.num[2]][s2.num[3]]=1;
68                 q.push(s2);
69             }
70         }
71     }
72 }
73 
74 int main()
75 {
76     int T,i,j;
77     char ch1[5],ch2[5];
78     scanf("%d",&T);
79     while(T--)
80     {
81         scanf("%s %s",ch1,ch2);  //输入两个字符串
82         for(i=0; i<4; i++)
83         {
84             fs.num[i]=ch1[i]-'0';    //将其转换为4个数字记录到数组中
85             fe.num[i]=ch2[i]-'0';
86         }
87         memset(ha,0,sizeof(ha));
88         BFS();
89     }
90     return 0;
91 }
原文地址:https://www.cnblogs.com/pshw/p/4757113.html