#include <iostream>
#include <queue>
#include <cstdio>
#include <cstring>
#include <cstdlib>
using namespace std;
typedef struct{
int num[4];
int step;
}Number;
int mark[10][10][10][10];
Number first, last;
void BFS(){
queue<Number> q;
first.step = 0;
q.push( first );
mark[first.num[3]][first.num[2]][first.num[1]][first.num[0]] = 1;
while( !q.empty() ){
Number n = q.front();
q.pop();
int flag = 1;
for( int i = 0; i < 4; i++ ){
if( n.num[i] != last.num[i] ){
flag = 0;
break;
}
}
if( flag ){
cout << n.step << endl;
return;
}
for( int i = 0; i < 4; i++ ){
Number nn = n;
nn.step += 1;
if( nn.num[i] == 9 ){
nn.num[i] = 1;
}else{
nn.num[i] += 1;
}
if( mark[nn.num[3]][nn.num[2]][nn.num[1]][nn.num[0]] == 0 ){
q.push( nn );
mark[nn.num[3]][nn.num[2]][nn.num[1]][nn.num[0]] = 1;
}
}
for( int i = 0; i < 4; i++ ){
Number nn = n;
nn.step += 1;
if( nn.num[i] == 1 ){
nn.num[i] = 9;
}else{
nn.num[i] -= 1;
}
if( mark[nn.num[3]][nn.num[2]][nn.num[1]][nn.num[0]] == 0 ){
q.push( nn );
mark[nn.num[3]][nn.num[2]][nn.num[1]][nn.num[0]] = 1;
}
}
for( int i = 3; i >= 1; i-- ){
Number nn = n;
nn.step += 1;
int t = nn.num[i];
nn.num[i] = nn.num[i-1];
nn.num[i-1] = t;
if( mark[nn.num[3]][nn.num[2]][nn.num[1]][nn.num[0]] == 0 ){
q.push( nn );
mark[nn.num[3]][nn.num[2]][nn.num[1]][nn.num[0]] = 1;
}
}
}
}
int main(){
char a[5], b[5];
int t;
cin >> t;
while( t-- ){
scanf( "%s", a );
scanf( "%s", b );
for( int i = 0; i < 4; i++ ){
first.num[i] = a[i] - '0';
}
for( int i = 0; i < 4; i++ ){
last.num[i] = b[i] - '0';
}
memset( mark, 0, sizeof( mark ) );
BFS();
}
return 0;
}
hdu 1195 BFS
最新推荐文章于 2023-02-27 21:02:05 发布