素数切换

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

最近ZC对素数的一些变换十分感兴趣,于是自定义了一款素数变换游戏。游戏规则如下:
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

第一行输入t,代表有t组测试数据,接下来由t行数据a,b,分别代表起始素数和目标素数。Ps:为了使问题简单化,ZC只要求你算出4位素数的之间的变换。保证输入的a,b都是4位素数。

Output

如果a无法变换到b,请输出“Impossible”,否则请输出最少步数。输出单独占一行。

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;
}

posted @ 2012-11-25 17:31  forevermemory  阅读(325)  评论(0编辑  收藏  举报