zoukankan      html  css  js  c++  java
  • POJ_3126 Prime Path 【BFS+素数打表】

    一、题目

    http://poj.org/problem?id=3126

    二、分析

    该题主要是要让我们找到一个$4$位素数到另一个$4$位素数的最少的变换次数,且要求保证每一次变换都满足

    1.下一个数必须是4位。

    2.下一个数必须是素数。

    知道满足这两个条件后,然后结合$BFS$即可求出解。

    这里有个处理4位数变换的技巧就是通过一个式子完成。

    $next = P\%T[i]+P/T[i+1]*T[i+1]+j*T[i]$

    这里的$T$数组为${1, 10, 100, 1000, 10000}$。具体的证明可以自己多画几项就出来了。

    三、AC代码

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <queue>
    #include <cmath>
    
    using namespace std;
    const int MAXN = 1e5;
    bool isPrime[MAXN];
    bool visit[MAXN];
    const int T[] = {1, 10, 100, 1000, 10000};
    int Start, End;
    struct Node
    {
        int value;
        int step;
    };
    
    void getPrime()
    {
        memset(isPrime, 1, sizeof(isPrime));
        
        isPrime[0] = isPrime[1] = 0;
        for(int i = 2; i < MAXN; i++)
        {
            if(isPrime[i])
            {
                for(int j = i*2; j < MAXN; j+=i)
                {
                    isPrime[j] = 0;
                }
            }
        }
    }
    
    int BFS()
    {
        memset(visit, 0, sizeof(visit));
        Node t;
        t.value = Start;
        visit[t.value] = 1;
        t.step = 0;    
        if(t.value == End)
            return t.step;
        queue<Node> Q;
        Q.push(t);
    
        while( !Q.empty() )
        {
            Node p = Q.front();
            Q.pop();
            t.step = p.step+1;
            for(int i = 0; i < 4; i++)
            {
                int temp, j;
                temp = p.value%T[i] + (p.value/T[i+1])*T[i+1];
                if( i == 3)
                    j = 1;
                else
                    j = 0;
                for(; j < 10; j++)
                {
                    t.value = temp + j*T[i]; 
                    if(!visit[t.value] && isPrime[t.value])
                    {
                        visit[t.value] = 1;
                        if(t.value == End)
                            return t.step;
                        Q.push(t);
                    }
                }
            }
        }
        return -1;
    }
    
    int main()
    {
        int N, Ans;
        getPrime();
        scanf("%d", &N);
        while(N--)
        {
            scanf("%d %d", &Start, &End);
            Ans = BFS();
            printf("%d
    ", Ans);
        }
        return 0;
    }
    View Code
  • 相关阅读:
    原型设计 + 用户规格说明书
    第三次作业
    MathExam第二次作业
    第一次随笔
    冲鸭第一的合作
    功能规格说明书
    测试与优化
    结对编程
    高分小学计算器
    现实与梦
  • 原文地址:https://www.cnblogs.com/dybala21/p/10042733.html
Copyright © 2011-2022 走看看