Problem I
Time Limit : 3000/1000ms (Java/Other) Memory Limit : 65535/32768K (Java/Other)
Total Submission(s) : 3 Accepted Submission(s) : 3
Font: Times New Roman | Verdana | Georgia
Font Size: ← →
Problem Description
1.随机给你a,b两个素数,问由a变换到b的最少步数。
2.规定每次只能变素数的一个数位。
3.规定每次变换产生的数都要是素数。
4.不能将给你的素数变成更低位的素数,如不能将4位的素数变成3位的素数。
5.1033->1733->3733->3739->3779->8779->8179 即可以得到将1033变到8179只需要6步。现在ZC遇到了一个问题,也就是素数位比较大时,要想获得最少步数的变换十分困难。作为聪明的程序员,现在ZC想求助于你,你能写出一个程序,帮助ZC算出最少步数吗?
Input
Output
Sample Input
3 1033 8179 1373 8017 1033 1033
Sample Output
6 7 0
#include<iostream>
#include<math.h>
#include<string.h>
using namespace std;
struct lm{
int pri;
int step;
};
lm queue[12000];
bool gcd(int x)
{
if(x==1) return false;
int i;
for(i=2;i<=(int)sqrt(x);i++)
{
if(x%i==0) return false;
}
return true;
}
int head,rear,x,y;
bool flag[12000];
void bfs()
{
head=rear=0;
int i;
queue[rear].pri=x;
queue[rear].step=0;
rear++;
flag[x]=true;
while(head<rear)
{
lm l=queue[head++];
int ge=l.pri%10;
int shi=l.pri/10%10;
if(l.pri==y)
{
cout<<l.step<<endl;
return;
}
for(i=1;i<=9;i+=2)
{
int tep=l.pri/10*10+i;
if(!flag[tep]&&gcd(tep))
{
flag[tep]=true;
queue[rear].pri=tep;
queue[rear++].step=l.step+1;
}
}
for(i=0;i<=9;i++)
{
int te=l.pri/100*100+i*10+ge;
if(!flag[te]&&gcd(te))
{
flag[te]=true;
queue[rear].pri=te;
queue[rear++].step=l.step+1;
}
}
for(i=0;i<=9;i++)
{
int ss=l.pri/1000*1000+i*100+shi*10+ge;
if(!flag[ss]&&gcd(ss))
{
flag[ss]=true;
queue[rear].pri=ss;
queue[rear++].step=l.step+1;
}
}
for(i=1;i<=9;i++)
{
int tt=i*1000+l.pri%1000;
if(!flag[tt]&&gcd(tt))
{
flag[tt]=true;
queue[rear].pri=tt;
queue[rear++].step=l.step+1;
}
}
}
cout<<"Impossible"<<endl;
return;
}
int main()
{
int n;
cin>>n;
while(n--)
{
cin>>x>>y;
memset(flag,false,sizeof(flag));
bfs();
}
return 0;
}