poj 3126

广搜算法求解素数谜题
本文介绍了一个使用广度优先搜索算法解决特定素数谜题的程序实现。该程序通过预先生成一定范围内的素数表,并利用广度优先搜索策略,在保持状态不重复的前提下,寻找从一个四位素数变换到另一个四位素数所需的最少步骤。

一道广搜的题 上学期写的~写得很神奇 我觉得~

 

#include <iostream>

#include <cmath>

using namespace std;

bool p[10000];

void isprime()                     //素数打表

{

int j,k,t;

memset(p,false,sizeof(p));

for(k=1001;k<10000;k=k+2)

{

t=int(sqrt(double(k)))+1;

for(j=3;j<t;j++)

if(k%j==0)

break;

if(j==t)

p[k]=true;

}

}

int main()

{

int N;

int n1,n2,front,rear,t,t1,t2,i,times;

int a[1100][2];

bool app[10000];

isprime();

scanf("%d",&N);

while(N--)

{

scanf("%d%d",&n1,&n2);

memset(app,false,sizeof(app));

front=0; rear=1;

app[n1]=true;

a[front][0]=n1;

a[front][1]=0;

 

while(app[n2]==false && front!=rear)

{

t=a[front][0];

t1=t+1000;

while(t1<10000)             //千位的加

{

if(p[t1] && !app[t1])             //   是否为素数 是则入队

{

a[rear][0]=t1;

a[rear][1]=a[front][1]+1;

app[t1]=true;

rear++;

}

t1+=1000;

}

t1=t-1000;

while(t1>=1000)            //千位的减

{

if(p[t1] && !app[t1])            

{

a[rear][0]=t1;

a[rear][1]=a[front][1]+1;

app[t1]=true;

rear++;

}

t1-=1000;

}

t1=(t/1000)*1000;

t2=t+100;

while(t2<t1+1000)          //百位的加

{

if(p[t2] && !app[t2])             //   是否为素数 是则入队

{

a[rear][0]=t2;

a[rear][1]=a[front][1]+1;

app[t2]=true;

rear++;

}

t2+=100;

}

t2=t-100;

while(t2>t1)                //百位的减

{

if(p[t2] && !app[t2])         

{

a[rear][0]=t2;

a[rear][1]=a[front][1]+1;

app[t2]=true;

rear++;

}

t2-=100;

}

t1=(t/100)*100;

t2=t+10;

while(t2<t1+100)      //十位的 加

{

if(p[t2] && !app[t2])         

{

a[rear][0]=t2;

a[rear][1]=a[front][1]+1;

app[t2]=true;

rear++;

}

t2+=10;

}

t2=t-10;

while(t2>t1)                //十位的减

{

if(p[t2] && !app[t2])         

{

a[rear][0]=t2;

a[rear][1]=a[front][1]+1;

app[t2]=true;

rear++;

}

t2-=10;

}

t1=(t/10)*10;

t2=t+2;

while(t2<t1+10)            //个位的加

{

if(p[t2] && !app[t2])         

{

a[rear][0]=t2;

a[rear][1]=a[front][1]+1;

app[t2]=true;

rear++;

}

t2+=2;

}

t2=t-2;

while(t2>t1)                //个位的减

{

if(p[t2] && !app[t2])         

{

a[rear][0]=t2;

a[rear][1]=a[front][1]+1;

app[t2]=true;

rear++;

}

t2-=2;

}

front++;

}

if(front==rear) 

printf("Impossible/n");

else

printf("%d/n",a[--rear][1]);

}

return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值