pku3126

本文介绍了一种通过广度优先搜索算法寻找两个四位素数之间的最短转换路径的方法。为解决该问题,首先生成了一个四位素数表,并利用广度优先搜索算法进行搜索。文章还分享了一些关于内存管理和优化的经验教训。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 寻找两个四位素数的转变路径最短长度,构建一个素数表,然后采用广度优先搜索.本来害怕记录已经搜索过的数据会增加内存使用量,就没有设,结果广搜时队列容量超限,反而在添加了搜索记录表后大大减少内存使用量,看来有些是可以省的,而有些东西是不能省的!还有,在记录搜索过的数据时开始想,既然是四位数,那就将每个数-1000存储,可以省1000各存储单元,结果使用的时候忘记了,导致对出错的结果分析了N久才发现栽在了这里,看来有些优化是得不偿失的!

Source:

#include<iostream>

#include<queue>

using namespace std;

 

int search(int s);

 

struct Node

{

    int v,s;

};

 

bool use[10000];

bool prim[10000];

int aim;

 

void GenPrim()

{

    int i,j;

    memset(prim,0,10000*sizeof(bool));

    for(i=2;i<10000;++i)

    {

       if(!prim[i])

       {

           for(j=i+i;j<10000;j+=i)prim[j]=true;

       }

    }

}

 

int main()

{

    int n,s;

    GenPrim();

    cin>>n;

    for(;n>0;--n)

    {

       cin>>s>>aim;

       cout<<search(s)<<endl;

    }

}

 

int search(int s)

{

    memset(use,0,10000*sizeof(bool));

    int t,i;

    Node c,*p=NULL;

    queue<Node> q;

   

    p=new Node();

    p->v=s;

    p->s=0;

   

    while(!q.empty())q.pop();

    q.push(*p);

    use[s]=true;

    while(!q.empty())

    {

       c=q.front();

       q.pop();

       //cout<<"["<<c.s<<","<<c.v<<"]"<<endl;

       if(c.v==aim)

       {

           return c.s;

       }

       //1

       t=c.v-c.v%10;

       for(i=1;i<=9;i+=2)

       {

           if(t+i!=c.v)

           {

              if(!prim[t+i] && !use[t+i])

              {

                  p=new Node();

                  p->v=t+i;

                  p->s=c.s+1;

                  q.push(*p);

                  use[t+i]=true;

              }

           }

       }

       //10

       t=c.v-((c.v%100)/10)*10;

       for(i=0;i<=90;i+=10)

       {

           if(t+i!=c.v)

           {

              if(!prim[t+i] && !use[t+i])

              {

                  p=new Node();

                  p->v=t+i;

                  p->s=c.s+1;

                  q.push(*p);

                  use[t+i]=true;

              }

           }

       }

       //100

       t=c.v-((c.v%1000)/100)*100;

       for(i=0;i<=900;i+=100)

       {

           if(t+i!=c.v)

           {

              if(!prim[t+i] && !use[t+i])

              {

                  p=new Node();

                  p->v=t+i;

                  p->s=c.s+1;

                  q.push(*p);

                  use[t+i]=true;

              }

           }

       }

       //1000

       t=c.v%1000;

       for(i=1000;i<=9000;i+=1000)

       {

           if(t+i!=c.v)

           {

              if(!prim[t+i] && !use[t+i])

              {

                  p=new Node();

                  p->v=t+i;

                  p->s=c.s+1;

                  q.push(*p);

                  use[t+i]=true;

              }

           }

       }

          

    }

    return -1;

}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值