这个题也是一BFS题,搜索的时候注意变化的要求,即9加1等于1,1减1等于9,需要注意每次加减操作都只能是1
用数组保存比较方便,刚开始想过直接搞~WA了好久~
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<queue>
using namespace std;
struct node
{
int num[4];
int ans;
};
queue<node> q;
bool vis[10][10][10][10];
int n,m,ans;
void BFS()
{
memset(vis,0,sizeof(vis));
node ita;
ita.num[3]=n%10;
ita.num[2]=n/10%10;
ita.num[1]=n/100%10;
ita.num[0]=n/1000;
ita.ans=0;
q.push(ita);
vis[ita.num[0]][ita.num[1]][ita.num[2]][ita.num[3]]=1;
while(!q.empty())
{
node v=q.front();
q.pop();
int val=0;
for(int i=0;i<4;i++)
val=val*10+v.num[i];
if(val==m)
{
ans=v.ans;
while(!q.empty())
q.pop();
return;
}
for(int i=0;i<4;i++)
{
node ita=v;
if(ita.num[i]==9)
ita.num[i]=1;
else
ita.num[i]++;
if(!vis[ita.num[0]][ita.num[1]][ita.num[2]][ita.num[3]])
{
ita.ans=v.ans+1;
q.push(ita);
vis[ita.num[0]][ita.num[1]][ita.num[2]][ita.num[3]]=1;
}
}
for(int i=0;i<4;i++)
{
node ita=v;
if(ita.num[i]==1)
ita.num[i]=9;
else
ita.num[i]--;
if(!vis[ita.num[0]][ita.num[1]][ita.num[2]][ita.num[3]])
{
ita.ans=v.ans+1;
q.push(ita);
vis[ita.num[0]][ita.num[1]][ita.num[2]][ita.num[3]]=1;
}
}
for(int i=0;i<3;i++)
{
node ita=v;
ita.num[i]=v.num[i+1];
ita.num[i+1]=v.num[i];
if(!vis[ita.num[0]][ita.num[1]][ita.num[2]][ita.num[3]])
{
ita.ans=v.ans+1;
q.push(ita);
vis[ita.num[0]][ita.num[1]][ita.num[2]][ita.num[3]]=1;
}
}
}
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
ans=0;
scanf("%d%d",&n,&m);
BFS();
printf("%d\n",ans);
}
return 0;
}