day6 POJ 3126 Prime Path

求解两个素数之间最小的变换,每次只能变动一个数字并且变动后必须为素数。

BFS的本质是搜索当前状态改变一次所能到达的所有状态,那么只需要枚举四个数字每个数字的变化并且进行搜索就可以了

这里注意一个点,在写判断素数的函数的时候 i<=sqrt(x) 我漏掉了=号 这样就会让很多数字判断错误结果WA了很多次  细节还是要多注意


#include"iostream"
#include"queue"
#include"cmath"
using namespace std;
queue<int>q;

int st,ed;

int v[10000];

int prime(int x)
{
    if(x==2||x==3) return 1;
    if(x<=1||x%2==0) return 0;
    for(int i=2;i<=sqrt(x);i++)
        if(x%i==0) return 0;
    return 1;
}
void BFS(int st,int y)
{


    while(!q.empty()) q.pop();
    q.push(st);
    while(!q.empty())
    {

        int x=q.front();
        //cout<<w<<endl;
        //cout<<endl;
        if(x==y) {cout<<v[x]<<endl; return;}
        int w;
        q.pop();
        //int k=x/10;
        for(int i=1;i<10;i+=2)
        {
            w=x/10*10+i;

            if(w!=x&&prime(w)&&v[w]==-1)
            {

                v[w]=v[x]+1;
                q.push(w);

            }
        }


        // k=x/100; int m=x%10;
        for(int i=0;i<10;i++)
        {
            w=x/100*100+i*10+x%10;

            if(w!=x&&prime(w)&&v[w]==-1)
            {
                v[w]=v[x]+1;
                q.push(w);

            }
        }

          //k=x/1000;  m=x%100;
        for(int i=0;i<10;i++)
        {
            w=x/1000*1000+i*100+x%100;

            if(w!=x&&prime(w)&&v[w]==-1)
            {

                v[w]=v[x]+1;
                q.push(w);

            }
        }
         //m=x%1000;
        for(int i=1;i<10;i++)
        {
            w=i*1000+x%1000;

            if(w!=x&&prime(w)&&v[w]==-1)
            {
                v[w]=v[x]+1;
                q.push(w);

            }
        }





    }
    cout<<"Impossible"<<endl;
}
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        cin>>st>>ed;
        for(int i=0;i<10000;i++) v[i]=-1;
        v[st]=0;
        BFS(st,ed);

    }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值