这道题没想好的方法,就是简单的改变每一位的数,一直循环到找到结果
#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
int n,m,vis[10000],v[10000]={0};
struct node
{
int s;
int k;
};
void prim()
{
for(int i=1000;i<10000;i++)
{
for(int j=2;j*j<=i;j++) //一开始忘记写等于号了 找了半天的错才找到。。。
if(i%j==0)
{
v[i]=1;
break;
}
}
}
int bfs(int x)
{
memset(vis,0,sizeof(vis));
queue<node>q;
int p[4];
node w,h;
w.s=x;
w.k=0;
vis[x]=1;
q.push(w);
while(!q.empty())
{
w=q.front();
q.pop();
if(w.s==m)
return w.k;
p[0]=w.s/1000;
p[1]=w.s/100%10;
p[2]=w.s/10%10;
p[3]=w.s%10;
/* for(int i=0;i<=9;i++) //第一种方法
{
h.s=p[0]*1000+p[1]*100+p[2]*10+i;
if(!v[h.s] && !vis[h.s])
{
h.k=w.k+1;
vis[h.s]=1;
q.push(h);
}
h.s=p[0]*1000+p[1]*100+i*10+p[3];
if(!v[h.s] && !vis[h.s])
{
h.k=w.k+1;
vis[h.s]=1;
q.push(h);
}
h.s=p[0]*1000+i*100+p[2]*10+p[3];
if(!v[h.s] && !vis[h.s])
{
h.k=w.k+1;
vis[h.s]=1;
q.push(h);
}
h.s=i*1000+p[1]*100+p[2]*10+p[3];
if(!v[h.s] && !vis[h.s] && i!=0)
{
h.k=w.k+1;
vis[h.s]=1;
q.push(h);
}
}*/
int cnt; //第二种方法
for(int i=0;i<4;i++)
{
cnt=p[i];
for(int j=0;j<=9;j++)
{
if(p[i]!=j)
p[i]=j;
if(i==0 && j==0)
continue;
h.s=p[0]*1000+p[1]*100+p[2]*10+p[3];
if(!v[h.s] && !vis[h.s])
{
h.k=w.k+1;
vis[h.s]=1;
q.push(h);
}
}
p[i]=cnt;
}
}
return -1;
}
int main()
{
prim();
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
int a=bfs(n);
if(a==-1)
printf("Impossible\n");
else
printf("%d\n",a);
}
return 0;
}