题目链接
题目大意:给俩4位数n1,n2,找出从n1变到n2的最小步数
思路:bfs一个一个找,外加素数打表防止TLE(我还是看别人的)。
代码:
#include<iostream>
#include<cstdlib>
#include<sstream>
#include<cstdio>
#include<stack>
#include<cstdio>
#include<map>
#include<set>
#include<queue>
#include<cstring>
#include<cmath>
#include<vector>
#include<algorithm>
using namespace std;
typedef long long LL;
#define me(a,b) memset(a,b,sizeof(a))
#define inf 0x3f3f3f3f
const int N=1111122;
const int M=200005;
int v[M],pr[M],l[5];
struct node
{
int ct,z;
};
queue<node> q;
int bfs(int a,int b)
{
int i,j,x,y;
node t,r,g;
r.z=a;r.ct=0;
v[a]=1;
q.push(r);
while(!q.empty())
{
t=q.front();
q.pop();
if(t.z==b)return t.ct;
l[3]=t.z%10;
l[2]=(t.z/10)%10;
l[1]=(t.z/100)%10;
l[0]=t.z/1000;
for(i=0;i<4;i++)
{
x=l[i];
for(j=0;j<=9;j++)
{
if(l[i]!=j)
{
l[i]=j;
y=l[0]*1000+l[1]*100+l[2]*10+l[3];
}
if(y>=1000&&y<10000&&v[y]==0&&pr[y]==0)
{
v[y]=1;
g.z=y;
g.ct=t.ct+1;
q.push(g);
}
}
l[i]=x;
}
}
return -1;
}
int main()
{
std::ios::sync_with_stdio;
int n,tt,i,j,m;
me(pr,0);
for(i=2;i<=12000;i++)
{
if(!pr[i])
{
for(j=2*i;j<=12000;j+=i)
{
if(!pr[j])pr[j]=1;
}
}
}
cin>>tt;
while(tt--)
{
me(v,0);
while(!q.empty())
q.pop();
cin>>n>>m;
int ans=bfs(n,m);
if(ans==-1)cout<<"Impossible"<<endl;
else cout<<ans<<endl;//这本来用了两次bfs(n,m),然后错了,原因是两次用但是就memset了一次。
}
system("pause");
return 0;
}