Poj 3126 Prime path

Poj 3126 Prime path

题意

	两个四位数的素数A,B。改变A中的一位数,让它变成素数需要1镑,问由A变成B至少需要多少镑?这样的素数对一共有n组。

思路

这是一道bfs题,一定要记住标记已经访问的数,否则会超时。

代码

#include <cstdio>
#include <queue>
#include <cmath>

struct Node{
    Node(int a,int b):cur(a),dis(b){}
    int cur;
    int dis;
};

bool checkPrime(int k){
    for(int i=2;i<int(sqrt(k*1.0))+1;++i)
        if(0==k%i)
            return false;
    return true;
}

void getNums(int k,int array[],int& n){
    n=0;
    int a=k/10*10;
    int b=k%10;
    for(int i=0;i<10;++i){
        if(i!=b)
            array[n++]=a+i;
    }
    a=k/100*100+k%10;
    b=k/10%10;
    for(int i=0;i<10;++i){
        if(i!=b)
            array[n++]=a+i*10;
    }
    a=k/1000*1000+k%100;
    b=k%1000/100;
       for(int i=0;i<10;++i){
           if(i!=b)
               array[n++]=a+i*100;
       }
    a=k%1000;
    b=k/1000;
    for(int i=1;i<10;++i){
        if(i!=b)
            array[n++]=a+i*1000;
    }
}

int bfs(int a,int b){
    int visited[10000];
    memset(visited,0,sizeof(visited));
    std::queue<Node> q;
    q.push(Node(a,0));
    visited[a]=1;
    while(!q.empty()){
        Node front=q.front();
        q.pop();
        int array[10000];
        int n;
        getNums(front.cur, array, n);
        for(int i=0;i<n;++i){
            if(checkPrime(array[i])&&!visited[array[i]]){
                if(array[i]==b)
                    return front.dis+1;
                else{
                    q.push(Node(array[i],front.dis+1));
                    visited[array[i]]=1;
                }     
            }
        }
    }
    return 0;
}

int main() {
    int n;
    while(~scanf("%d",&n)&&n!=0){
        int a[101][2];
        for(int i=0;i<n;++i){
            scanf("%d%d",&a[i][0],&a[i][1]);
        }
        for(int i=0;i<n;++i){
            if(a[i][0]==a[i][1])
                printf("0\n");
            else
                printf("%d\n",bfs(a[i][0],a[i][1]));
        }
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值