标签: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; }
标签:nbsp name namespace ret ring 起点 break mes 题解
原文地址:https://www.cnblogs.com/Edviv/p/12241925.html