题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1195
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<queue>
using namespace std;
int vis[10][10][10][10];
int s[10],s1[10];
struct node
{
int a,b,c,d,step;
};
void bfs()
{
node p,q;
queue<node> Q;
memset(vis,0,sizeof(vis));
p.a=s[0];p.b=s[1];p.c=s[2];p.d=s[3];
vis[p.a][p.b][p.c][p.d]=1;
p.step=0;
Q.push(p);
while(!Q.empty())
{
q=Q.front();Q.pop();
if(q.a==s1[0]&&q.b==s1[1]&&q.c==s1[2]&&q.d==s1[3])
{
printf("%d\n",p.step-1);
return ;
}
for(int i=0;i<4;i++)//+1
{
if(i==0)
{
if(q.a==9) p.a=1;
else p.a=q.a+1;
p.b=q.b;p.c=q.c;p.d=q.d;
}
else if(i==1)
{
if(q.b==9) p.b=1;
else p.b=q.b+1;
p.a=q.a;p.c=q.c;p.d=q.d;
}
else if(i==2)
{
if(q.c==9) p.c=1;
else p.c=q.c+1;
p.a=q.a;p.b=q.b;p.d=q.d;
}
else
{
if(q.d==9) p.d=1;
else p.d=q.d+1;
p.a=q.a;p.c=q.c;p.b=q.b;
}
if(!vis[p.a][p.b][p.c][p.d])
{
p.step=q.step+1;
vis[p.a][p.b][p.c][p.d]=1;
Q.push(p);
}
}
for(int i=0;i<4;i++)//-1
{
if(i==0)
{
if(q.a==1) p.a=9;
else p.a=q.a-1;
p.b=q.b;p.c=q.c;p.d=q.d;
}
else if(i==1)
{
if(q.b==1) p.b=9;
else p.b=q.b-1;
p.a=q.a;p.c=q.c;p.d=q.d;
}
else if(i==2)
{
if(q.c==1) p.c=9;
else p.c=q.c-1;
p.a=q.a;p.b=q.b;p.d=q.d;
}
else
{
if(q.d==1) p.d=9;
else p.d=q.d-1;
p.a=q.a;p.c=q.c;p.b=q.b;
}
if(!vis[p.a][p.b][p.c][p.d])
{
p.step=q.step+1;
vis[p.a][p.b][p.c][p.d]=1;
Q.push(p);
}
}
for(int i=0;i<3;i++)//两两交换
{
if(i==0)
{
p.a=q.b;p.b=q.a;
p.c=q.c;p.d=q.d;
}
else if(i==1)
{
p.a=q.a;p.b=q.c;
p.c=q.b;p.d=q.d;
}
else
{
p.a=q.a;p.b=q.b;
p.c=q.d;p.d=q.c;
}
if(!vis[p.a][p.b][p.c][p.d])
{
p.step=q.step+1;
vis[p.a][p.b][p.c][p.d]=1;
Q.push(p);
}
}
}
return ;
}
int main()
{
int n;
char c,str[10],str1[11];
cin>>n;
while(n--)
{
cin>>str;
cin>>str1;
for(int i=0;i<4;i++)
s[i]=str[i]-'0';
for(int i=0;i<4;i++)
s1[i]=str1[i]-'0';
scanf("%c",&c);
bfs();
}
}