zoukankan      html  css  js  c++  java
  • POJ 3126 Prime Path

    https://vjudge.net/problem/POJ-3126

    题意:T组数据,每组数据给你两个四位数 a 和 b.

    每次你可以变幻四位数 a 某个位置上的数字,得到一个新的四位数 t,并且 t 是素数,

    问变幻多少次后,可以得到四位数 b.

    题解:埃式筛法求素数(暴力求素数应该也可,口嗨)+裸BFS。

    #include <iostream>
    #include <stdio.h>
    #include <cstring>
    #include <cmath>
    #include <queue>
    #include <set>
    using namespace std;
    const int N = 1e3 + 7;
    const int MAXN = 1e5 + 7;
    int prime[N];   //存素数
    bool vis[MAXN],st[MAXN];
    int t,a,b;
    
    struct node
    {
        int num,step;
    };
    
    void isprime(int num)  //埃式筛法
    {
        int idx = 0;
        memset(st,false,sizeof(st));
        for(int i = 2; i <= num; i++)
        {
            if(!vis[i])  // i 是素数
            {
                prime[idx++] = i;
                st[i] = true;
            }
            for(int j = 0; prime[j] <= num/i; j++)
            {
                vis[prime[j]*i] = true;
                if(i%prime[j] == 0) break;
            }
        }
    }
    
    void BFS(int s, int e)
    {
        set<int>S;
        S.insert(s);
        node start;
        start.num = s, start.step = 0;
        queue<node>q;
        q.push(start);
        while(!q.empty())
        {
            node now = q.front();
            q.pop();
            if(now.num == e)  //到达终点,输出转换次数
            {
                printf("%d
    ",now.step);
                return;
            }
    
            for(int i = 0; i < 4; i++)
            {
                int j = i,wei = 1;
                while(j--)
                    wei *= 10;
                int digt = (now.num/wei)%10;
                int temp = now.num - digt*wei;
    
                for(int j = 0; j <= 9; j++)
                {
                    if(i == 3 && j == 0) continue;  //千位不能是0
                    int number = temp + wei*j;
    
                    if(st[number] && S.find(number) == S.end()) // S.find()查重,没查到会返回 S.end()
                    {
                        node Next;
                        Next.num = number;
                        Next.step = now.step+1;
                        q.push(Next);
                        S.insert(number);
                    }
                }
            }
        }
        S.clear();  //清空
    }
    
    int main()
    {
        scanf("%d",&t);
        isprime(9999);  //打表
        while(t--)  //t组数据
        {
            scanf("%d %d",&a,&b);  //起点,终点
            BFS(a,b);
        }
        return 0;
    }
    

      

  • 相关阅读:
    CCF NOI1079 合法C标识符
    CCF NOI1080 统计字符
    CCF NOI1076 进制转换
    CCF NOI1065 最小公倍数
    CCF NOI1139 高精度减法
    CCF NOI1138 高精度加法
    CCF NOI1115 找数
    CCF NOI1097 数列
    CCF NOI1089 高精度运算
    NUC1931 Problem D 区间素数【素数筛选】
  • 原文地址:https://www.cnblogs.com/Edviv/p/12241925.html
Copyright © 2011-2022 走看看