题意这么简单就不用说了吧,就是把a密码变到b密码最少要几步........
毫无疑问用广搜比较简单一点吧,而且这题不用优化,直接的普通BFS是15m水过的
以一步为一层搜索......
come on! 一言不合上代码:
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
#include<queue>
using namespace std;
struct node
{
int num[4];
int count; //步数
}a,b;
struct node bend;
struct node c;
int mark[10][10][10][10]; //标记改点是否走过
int dfs()
{
int temp,i;
queue<node> q;
mark[a.num[0]][a.num[1]][a.num[2]][a.num[3]]=1;
q.push(a);
while(!q.empty())
{
bend=q.front();
q.pop();
if(bend.num[0]==b.num[0]&&bend.num[1]==b.num[1]&&bend.num[2]==b.num[2]&&bend.num[3]==b.num[3])//检查是否变成了真密码
{
return bend.count;
}
for(i=0;i<4;i++)//进行+1变换
{
c=bend;
c.num[i]++;
if(c.num[i]==10)
c.num[i]=1;
if(mark[c.num[0]][c.num[1]][c.num[2]][c.num[3]]!=1)
{
mark[c.num[0]][c.num[1]][c.num[2]][c.num[3]]=1;
c.count++;
q.push(c);
}
}
for(i=0;i<4;i++)//进行-1变换
{
c=bend;
c.num[i]--;
if(c.num[i]==0)
c.num[i]=9;
if(mark[c.num[0]][c.num[1]][c.num[2]][c.num[3]]!=1)
{
mark[c.num[0]][c.num[1]][c.num[2]][c.num[3]]=1;
c.count++;
q.push(c);
}
}
for(i=0;i<3;i++)//进行换位变换
{
c=bend;
temp=c.num[i];
c.num[i]=c.num[i+1];
c.num[i+1]=temp;
if(mark[c.num[0]][c.num[1]][c.num[2]][c.num[3]]!=1)
{
mark[c.num[0]][c.num[1]][c.num[2]][c.num[3]]=1;
c.count++;
q.push(c);
}
}
}
}
int main()
{
int n,i,j,k,l,aa,bb;
scanf("%d",&n);
while(n--)
{
memset(mark,0,sizeof(mark));
scanf("%d",&aa);
for(i=3;i>=0;i--)
{
a.num[i]=aa%10;
aa/=10;
}
a.count=0;
scanf("%d",&bb);
for(i=3;i>=0;i--)
{
b.num[i]=bb%10;
bb/=10;
}
b.count=0;
printf("%d\n",dfs());
}
return 0;
}