题意
给你两个数字锁,abcd,edfg,每次只能移动连续的k个(1<=k<=4),问从第一个状态到第二个状态最少需要多少步。
解析
我们从 A->B 实际上转动的是差值,我们可以等价为从 0000->C,C是我们将A和B每一位进行相减得到结果。所以bfs跑最短路即可。
代码
#include<bits/stdc++.h>
#include<unordered_map>
using namespace std;
unordered_map<string,int>mp;
void bfs(){
string x="0000";
queue<string>q;
q.push(x);
mp[x]=0;
while(!q.empty()){
string t=q.front();q.pop();
for(int k=1;k<=4;k++){
for(int i=0;i+k-1<4;i++){
int j=i+k-1;
string add=t,sub=t;
for(int w=i;w<=j;w++){
add[w]=((add[w]-'0'+1)%10)+'0';
sub[w]=((sub[w]-'0'+9)%10)+'0';
}
if(mp.find(add)==mp.end()){
q.push(add);
mp[add]=mp[t]+1;
}
if(mp.find(sub)==mp.end()){
q.push(sub);
mp[sub]=mp[t]+1;
}
}
}
}
}
int main() {
int n,T;
scanf("%d",&T);
bfs();
while(T--){
string a,b,c="0000";
cin>>a>>b;
for(int i=0;i<4;i++){
c[i]=(a[i]-b[i]+10)%10+'0';
}
printf("%d\n",mp[c]);
}
return 0;
}