码迷,mamicode.com
首页 > 其他好文 > 详细

POJ 3126 Prime Path

时间:2020-01-30 10:07:05      阅读:62      评论:0      收藏:0      [点我收藏+]

标签:nbsp   name   namespace   ret   ring   起点   break   mes   题解   

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\n",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;
}

  

POJ 3126 Prime Path

标签:nbsp   name   namespace   ret   ring   起点   break   mes   题解   

原文地址:https://www.cnblogs.com/Edviv/p/12241925.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!