题意:两个四位数字进行转化,每一次可以对其中一位数+1或者-1(1-1=9 9+1=1),或者交换相邻的两位。
思路,因为最多不超过10000种状态,所以直接bfs一下,有11种状态
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<time.h>
#include<set>
#include<stack>
#include<vector>
#include<map>
#include<queue>
#define pi acos(-1)
#define maxn 111111
#define maxm 11111
#define INF 0x3F3F3F3F
#define eps 1e-8
#define pb push_back
#define mem(a) memset(a,0,sizeof a)
using namespace std;
const long long mod = 1000000007;
int vis[11][11][11][11];
struct NODE {
int num[5];
int step;
};
NODE x1, x2;
NODE exchange(NODE x, int k) {
if(k <= 4) {
if(x.num[k] == 9) x.num[k] = 1;
else x.num[k]++;
}
else if(k <= 8) {
if(x.num[k - 4] == 1) x.num[k - 4] = 9;
else x.num[k - 4]--;
}
else {
int pos = k - 8;
swap(x.num[pos], x.num[pos + 1]);
}
x.step++;
return x;
}
void init() {
}
int main() {
int t;
char s1[10], s2[10];
scanf("%d", &t);
while(t--) {
memset(vis, INF, sizeof vis);
scanf("%s%s", s1, s2);
for(int i = 1; i <= 4; i++) {
x1.num[i] = s1[i - 1] - '0';
x2.num[i] = s2[i - 1] - '0';
}
x1.step = 0;
x2.step = INF;
queue<NODE>gg;
gg.push(x1);
vis[x1.num[1]][x1.num[2]][x1.num[3]][x1.num[4]] = 0;
int kase = 0;
while(!gg.empty()) {
NODE temp = gg.front();
gg.pop();
for(int i = 1; i <= 11; i++) {
NODE temp1 = exchange(temp, i);
if(vis[temp1.num[1]][temp1.num[2]][temp1.num[3]][temp1.num[4]] == INF) {
vis[temp1.num[1]][temp1.num[2]][temp1.num[3]][temp1.num[4]] = temp1.step;
gg.push(temp1);
}
}
}
printf("%d\n", vis[x2.num[1]][x2.num[2]][x2.num[3]][x2.num[4]]);
}
return 0;
}