素数判断+BFS POJ 3126

题意:

给两个四位的素数,求出从第一个素数变为第二个素数的最短路径。每步可以变素数的一位,并且每步得到的数必须是素数。

先把素数打表,然后bfs求最短路径就可以了,如果变换后得到的数是素数,就加入队列。

代码:

#include <cstdlib>
#include <cctype>
#include <cstring>
#include <cstdio>
#include <cmath>
#include<climits>
#include <algorithm>
#include <vector>
#include <string>
#include <iostream>
#include <sstream>
#include <map>
#include <set>
#include <queue>
#include <stack>
#include <fstream>
#include <numeric>
#include <iomanip>
#include <bitset>
#include <list>
#include <stdexcept>
#include <functional>
#include <utility>
#include <ctime>
using namespace std;

#define PB push_back
#define MP make_pair

#define REP(i,x,n) for(int i=x;i<(n);++i)
#define FOR(i,l,h) for(int i=(l);i<=(h);++i)
#define FORD(i,h,l) for(int i=(h);i>=(l);--i)
#define SZ(X) ((int)(X).size())
#define ALL(X) (X).begin(), (X).end()
#define RI(X) scanf("%d", &(X))
#define RII(X, Y) scanf("%d%d", &(X), &(Y))
#define RIII(X, Y, Z) scanf("%d%d%d", &(X), &(Y), &(Z))
#define DRI(X) int (X); scanf("%d", &X)
#define DRII(X, Y) int X, Y; scanf("%d%d", &X, &Y)
#define DRIII(X, Y, Z) int X, Y, Z; scanf("%d%d%d", &X, &Y, &Z)
#define OI(X) printf("%d",X);
#define RS(X) scanf("%s", (X))
#define MS0(X) memset((X), 0, sizeof((X)))
#define MS1(X) memset((X), -1, sizeof((X)))
#define LEN(X) strlen(X)
#define F first
#define S second
#define Swap(a, b) (a ^= b, b ^= a, a ^= b)
#define Dpoint  strcut node{int x,y}
#define cmpd int cmp(const int &a,const int &b){return a>b;}

 /*#ifdef HOME
    freopen("in.txt","r",stdin);
    #endif*/
const int MOD = 1e9+7;
typedef vector<int> VI;
typedef vector<string> VS;
typedef vector<double> VD;
typedef long long LL;
typedef pair<int,int> PII;
//#define HOME

int Scan()
{
	int res = 0, ch, flag = 0;

	if((ch = getchar()) == '-')				//判断正负
		flag = 1;

	else if(ch >= '0' && ch <= '9')			//得到完整的数
		res = ch - '0';
	while((ch = getchar()) >= '0' && ch <= '9' )
		res = res * 10 + ch - '0';

	return flag ? -res : res;
}
/*----------------PLEASE-----DO-----NOT-----HACK-----ME--------------------*/

int prime[10000];
int vis[10005];
void getprime()
{int cnt=0;
    for(int i=2;i<=10000;i++)
        {
            if(!vis[i])
            {
                prime[cnt++]=i;

            }
            for(int j=0;j<cnt&&prime[j]<=10000/i;j++)
            {
                vis[prime[j]*i]=1;
                if(i%prime[j]==0)
                    break;
            }
        }
}

string str1,str2;
queue<string>q;
set<string>r;
int cost[100000];
int bfs()
{while(!q.empty())
q.pop();
int front=0,rear=1;
q.push(str1);
r.clear();
r.insert(str1);
cost[0]=0;
while(front<rear)
{
    string now=q.front();
    q.pop();
    if(now==str2)
        return cost[front];
    REP(i,0,4)
    REP(j,0,10)
    {if(i==0&&j==0)
    continue;
    string tmp=now;
    tmp[i]='0'+j;
    int res=0;
    REP(k,0,4)
    res=res*10+tmp[k]-'0';
    if(!vis[res]&&!r.count(tmp))
    {q.push(tmp);
    r.insert(tmp);
    cost[rear]=cost[front]+1;
    rear++;

    }

    }
    front++;
}
return -1;

}
int main()
{getprime();
int T;
RI(T);
while(T--)
{cin>>str1>>str2;
MS0(cost);
int ans=bfs();
if(ans!=-1)
    printf("%d\n",ans);
else
    printf("Impossible\n");

}

        return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-05 16:52:46

素数判断+BFS POJ 3126的相关文章

素数判断BFS之“Prime Path”

题目大意: 给两个素数 a ,b ,在(1033 -- 8179)之间(左闭右闭).询问将 a 变成 b 的最短步数. 找不到输出  Impossible  . 每次只能改变一个数字,千位数字不能出现 0 .而且每次一步改变后的数仍然为素数. 样例: 3 1033 8179 1373 8017 1033 1033 -------- 6 7 0 解释其中第一个样例: 1033  -->  1733  -->  3733  -->  3739  -->  3779  -->  8

BFS/poj 3126 prime path

1 #include<cstdio> 2 #include<queue> 3 #include<cstring> 4 #include<cmath> 5 using namespace std; 6 int n,x,y; 7 bool v[20000]; 8 struct point 9 { 10 int x; 11 int step; 12 }; 13 14 int change(int x,int y,int z) 15 { 16 if (z==4) r

F - Prime Path POJ 3126 筛选素数+bfs

F - Prime Path Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Submit Status Practice POJ 3126 Description The ministers of the cabinet were quite upset by the message from the Chief of Security stating that they would all have t

POJ 3126 Prime Path (BFS + 素数筛)

链接 : Here! 思路 : 素数表 + BFS, 对于每个数字来说, 有四个替换位置, 每个替换位置有10种方案(对于最高位只有9种), 因此直接用 BFS 搜索目标状态即可. 搜索的空间也不大... /************************************************************************* > File Name: E.cpp > Author: > Mail: > Created Time: 2017年11月26日

POJ 3126 Prime Path(素数路径)

p.MsoNormal { margin-bottom: 10.0000pt; font-family: Tahoma; font-size: 11.0000pt } h1 { margin-top: 5.0000pt; margin-bottom: 5.0000pt; text-align: left; font-family: 宋体; font-weight: bold; font-size: 24.0000pt } span.10 { font-family: "Times New Rom

poj 3126 Prime Path 【暴力BFS】

题意:给你一个4位数,再给你一个4位数,如前一个数的每次只移动一位,问你能不能将第一个数变成第二个. 转移条件:1,只能通过素数作为中转,2,每次移动一位. 如果找到输出最少的转移次数(或步数), 如果找不到输出Impossible. 策略:如题. 直接上代码: #include<stdio.h> #include<string.h> #include<queue> #define M 10005 using std::queue; int vis[10000]; in

POJ - 3126 - Prime Path(BFS)

Prime Path POJ - 3126 题意: 给出两个四位素数 a , b.然后从a开始,每次可以改变四位中的一位数字,变成 c,c 可以接着变,直到变成b为止.要求 c 必须是素数.求变换次数的最小值.(a,b,c都是四位数字,输入时没有前导零) 分析: 每次改变可以获得一个四位数c,然后如果c是素数并且之前没有出现过,那么我们把它放入队列即可. int f[10001]; int v[10001]; void init()//素数筛 { memset(f,0,sizeof f); fo

POJ 2262 Goldbach&#39;s Conjecture (素数判断)

Goldbach's Conjecture Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 37693   Accepted: 14484 Description In 1742, Christian Goldbach, a German amateur mathematician, sent a letter to Leonhard Euler in which he made the following conject

POJ 1811 大素数判断

数据范围很大,用米勒罗宾测试和Pollard_Rho法可以分解大数. 模板在代码中 O.O #include <iostream> #include <cstdio> #include <cstring> #include <cstdlib> #include <cmath> using namespace std; __int64 pri[]= {2,3,5,7,11,13,17,19,23,29,31};//用小素数表做随机种子避免第一类卡米