版权声明:本文为博主原创文章,转载请注明出处( • ̀ω•́ )✧ https://blog.csdn.net/wangws_sb/article/details/83445357
题目:给定两个四位数n,m,每次改变n中的一位数并且保证改变后的n仍然是素数,问n最少要经过多少次改变才能变成m。若不论经过多少次改变都不能变成m那么输出Impossible。
题解:BFS,枚举改变的数。
注意:1.最后一位数一定不能是偶数,中间两位数可以是0~9的任意值,第一位数一定不能是0。
2.如果一个改变的数在之前就已经得到过了,就不用再次变回它了,所以用vis数组标记一下已经改变过的数。
AC代码:
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <string>
#include <cmath>
#include <queue>
#include <stack>
#include <vector>
#include <map>
#include <set>
using namespace std;
#define io ios::sync_with_stdio(0),cin.tie(0)
#define ms(arr) memset(arr,0,sizeof(arr))
#define inf 0x3f3f3f
typedef long long ll;
const int mod=1e9+7;
const int maxn=1e5+7;
int t,n,m,vis[maxn];
struct node
{
int a,b,c,d;
int step;
node(){}
node(int _a,int _b,int _c,int _d):a(_a),b(_b),c(_c),d(_d){}
};
bool isPrime(int x)//判断x是否为素数
{
for(int i=2;i*i<=x;i++)
{
if(x%i==0)
return false;
}
return true;
}
bool isequal(node x,node y)//判断x,y是否相等
{
if(x.a==y.a&&x.b==y.b&&x.c==y.c&&x.d==y.d)
return true;
return false;
}
queue <node> q;
void bfs()
{
while(!q.empty())
{
q.pop();
}
vis[n]=1;
node tmp;
tmp.a=n%10;n/=10;
tmp.b=n%10;n/=10;
tmp.c=n%10;n/=10;
tmp.d=n;
tmp.step=0;
node ans;
ans.a=m%10;m/=10;
ans.b=m%10;m/=10;
ans.c=m%10;m/=10;
ans.d=m;
q.push(tmp);
while(!q.empty())
{
node now=q.front();
q.pop();
if(isequal(now,ans))//若now与ans相等,输出now改变的次数
{
cout<<now.step<<endl;
return ;
}
for(int i=1;i<=9;i+=2)
{
if(now.a!=i)
{
tmp=node(i,now.b,now.c,now.d);
tmp.step=now.step+1;
if(isPrime(tmp.a+tmp.b*10+tmp.c*100+tmp.d*1000)&&vis[tmp.a+tmp.b*10+tmp.c*100+tmp.d*1000]==0)
{
q.push(tmp);
vis[tmp.a+tmp.b*10+tmp.c*100+tmp.d*1000]=1;
}
}
}
for(int i=0;i<=9;i++)
{
if(now.b!=i)
{
tmp=node(now.a,i,now.c,now.d);
tmp.step=now.step+1;
if(isPrime(tmp.a+tmp.b*10+tmp.c*100+tmp.d*1000)&&vis[tmp.a+tmp.b*10+tmp.c*100+tmp.d*1000]==0)
{
q.push(tmp);
vis[tmp.a+tmp.b*10+tmp.c*100+tmp.d*1000]=1;
}
}
}
for(int i=0;i<=9;i++)
{
if(now.c!=i)
{
tmp=node(now.a,now.b,i,now.d);
tmp.step=now.step+1;
if(isPrime(tmp.a+tmp.b*10+tmp.c*100+tmp.d*1000)&&vis[tmp.a+tmp.b*10+tmp.c*100+tmp.d*1000]==0)
{
q.push(tmp);
vis[tmp.a+tmp.b*10+tmp.c*100+tmp.d*1000]=1;
}
}
}
for(int i=1;i<=9;i++)
{
if(now.d!=i)
{
tmp=node(now.a,now.b,now.c,i);
tmp.step=now.step+1;
if(isPrime(tmp.a+tmp.b*10+tmp.c*100+tmp.d*1000)&&vis[tmp.a+tmp.b*10+tmp.c*100+tmp.d*1000]==0)
{
q.push(tmp);
vis[tmp.a+tmp.b*10+tmp.c*100+tmp.d*1000]=1;
}
}
}
}
cout<<"Impossible"<<endl;
return ;
}
int main()
{
io;
cin>>t;
while(t--)
{
cin>>n>>m;
ms(vis);
bfs();
}
return 0;
}