Open the Lock
1 #include <stdio.h>
2 #include <memory>
3 #define MAX_N 10002
4 int state[10][10][10][10];
5 struct LOCK
6 {
7 char key[5];
8 }lock,unlock,que[MAX_N];
9 void Change(LOCK &itemp, int ii)
10 {
11 int k=ii%4;
12 char temp;
13 if(ii>7)//????
14 {
15 temp=itemp.key[k];
16 itemp.key[k]=itemp.key[k+1];
17 itemp.key[k+1]=temp;
18 }
19 else if(ii>3)//++
20 {
21 if(itemp.key[k]=='9') itemp.key[k]='1';
22 else itemp.key[k]++;
23 }
24 else //--
25 {
26 if(itemp.key[k]=='1') itemp.key[k]='9';
27 else itemp.key[k]--;
28 }
29 }
30 int BFS()
31 {
32 int i,head=0,tail=0;
33 LOCK temp1,temp2;
34 if(strcmp(lock.key,unlock.key)==0) return 0;
35 memset(state,-1,sizeof(state));
36 state[lock.key[0]-'0'][lock.key[1]-'0'][lock.key[2]-'0'][lock.key[3]-'0']=0;
37 strcpy(que[0].key,lock.key);
38 while (head<=tail)
39 {
40 strcpy(temp1.key,que[head++].key);
41 for(i=0;i<11;i++)
42 {
43 temp2=temp1;
44 Change(temp2,i);
45 if(strcmp(temp2.key,unlock.key)==0)
46 return state[temp1.key[0]-'0'][temp1.key[1]-'0'][temp1.key[2]-'0'][temp1.key[3]-'0']+1;
47 else if(state[temp2.key[0]-'0'][temp2.key[1]-'0'][temp2.key[2]-'0'][temp2.key[3]-'0']==-1)
48 {
49 state[temp2.key[0]-'0'][temp2.key[1]-'0'][temp2.key[2]-'0'][temp2.key[3]-'0']=
50 state[temp1.key[0]-'0'][temp1.key[1]-'0'][temp1.key[2]-'0'][temp1.key[3]-'0']+1;
51 strcpy(que[tail++].key,temp2.key);
52 }
53 }
54 }
55 return -1;
56 }
57 int main(void)
58 {
59 int t;
60 scanf("%d",&t);
61 while(t--)
62 {
63 scanf("%s%s",lock.key,unlock.key);
64 printf("%d\n",BFS());
65 }
66 return 0;
67 }
68 /*
69 #include <iostream>
70 #include <queue>
71 using namespace std;
72
73 int visited[10000];
74
75 void myget(int num, int arr[], int n)
76 {
77 for(int i = 3; i >= 0; --i)
78 {
79 arr[i] = num % 10;
80 num /= 10;
81 }
82 }
83
84 int fab(int a)
85 {
86 return a > 0 ? a : -a;
87 }
88 int main()
89 {
90 int cas;
91 scanf("%d", &cas);
92 while(cas--)
93 {
94 memset(visited, 0, sizeof(visited));
95 int a[4], key[4];
96 for(int i = 0; i < 4; ++i)
97 scanf("%1d", a + i);
98 for(int i = 0; i < 4; ++i)
99 scanf("%1d", key + i);
100 int front = 0, tail = 0;
101 int queue[10000];
102 queue[tail] = 1000*a[0] + 100*a[1] + 10*a[2] + a[3];
103 tail++;
104 int arr[4];
105 while(front < tail)
106 {
107
108 int temp = queue[front++];
109 myget(temp, arr, 4);
110 for(int i = 0; i < 4; ++i)
111 {
112 for(int j = i - 1; j <= i + 1 && (j != i); ++j)
113 {
114 if(j >= 0 && j < 4)
115 {
116 swap(arr[i], arr[j]);
117 int num = 1000*arr[0] + 100*arr[1] + 10*arr[2] + arr[3];
118 if(visited[num] == 0 || visited[num] > visited[temp] + 1)
119 {
120 visited[num] = visited[temp] + 1;
121 queue[tail] = num;
122 tail++;
123 }
124 swap(arr[i], arr[j]);
125 }
126 }
127 }
128 }
129 visited[1000*a[0] + 100*a[1] + 10*a[2] + a[3]] = 0;
130 int mmin = 1 << 30;
131 for(int i = 0; i < 10000; ++i)
132 if(visited[i] > 0 || i == 1000*a[0] + 100*a[1] + 10*a[2] + a[3])
133 {
134 // printf("%d %d\n", i, visited[i]);
135 myget(i, arr, 4);
136 for(int j = 0; j < 4; ++j)
137 {
138
139 visited[i] += min(9 - fab(arr[j] - key[j]), fab(arr[j] - key[j]));
140 }
141 mmin = min(mmin, visited[i]);
142 }
143 printf("%d\n", mmin);
144 }
145 return 0;
146 }
147 /*
148 /*
149 10
150 2345
151 7653
152
153 2191
154 3333
155
156 7893
157 1111
158
159 2333
160 9988
161
162 5678
163 3454
164 */
哎,弱爆了,到了只能抄别人代码的地步了
我也不想啊,关键是对比了一下自己的测试数据结果都一样啊,你让我怎么改???!!!
http://hi.baidu.com/for_wind_/blog/item/9b9d72cfd75ee911be09e6e6.html

浙公网安备 33010602011771号