首页 > 其他分享 >POJ 3126 Prime Path 素数+BFS

POJ 3126 Prime Path 素数+BFS

时间:2023-02-07 12:34:49浏览次数:60  
标签:Prime prime digit int listt 3126 number BFS include


Prime Path

Time Limit: 1000MS

 

Memory Limit: 65536K

Total Submissions: 27754

 

Accepted: 15152

Description

POJ 3126 Prime Path  素数+BFS_#include

The ministers of the cabinet were quite upset by the message from the Chief of Security stating that they would all have to change the four-digit room numbers on their offices. 

— It is a matter of security to change such things every now and then, to keep the enemy in the dark. 

— But look, I have chosen my number 1033 for good reasons. I am the Prime minister, you know! 

— I know, so therefore your new number 8179 is also a prime. You will just have to paste four new digits over the four old ones on your office door. 

— No, it’s not that simple. Suppose that I change the first digit to an 8, then the number will read 8033 which is not a prime! 

— I see, being the prime minister you cannot stand having a non-prime number on your door even for a few seconds. 

— Correct! So I must invent a scheme for going from 1033 to 8179 by a path of prime numbers where only one digit is changed from one prime to the next prime. 


Now, the minister of finance, who had been eavesdropping, intervened. 

— No unnecessary expenditure, please! I happen to know that the price of a digit is one pound. 

— Hmm, in that case I need a computer program to minimize the cost. You don't know some very cheap software gurus, do you? 

— In fact, I do. You see, there is this programming contest going on... Help the prime minister to find the cheapest prime path between any two given four-digit primes! The first digit must be nonzero, of course. Here is a solution in the case above. 

1033
1733
3733
3739
3779
8779
8179

The cost of this solution is 6 pounds. Note that the digit 1 which got pasted over in step 2 can not be reused in the last step – a new 1 must be purchased.

Input

One line with a positive number: the number of test cases (at most 100). Then for each test case, one line with two numbers separated by a blank. Both numbers are four-digit primes (without leading zeros).

Output

One line for each case, either with a number stating the minimal cost or containing the word Impossible.

Sample Input

3
1033 8179
1373 8017
1033 1033

Sample Output

6
7
0

Source

​Northwestern Europe 2006​

算法分析:

题意:

给你两个四位数你n,m,改变n四位数字,一次只能变化一个,问变成m需要几步,中间必须要满足都是素数

实现

以为是最短路,竟然忘了BFS,哎,实现看看代码把,很简单(没看到是四位数)。

代码实现:

#include<cstdio>  
#include<cstring>
#include<cstdlib>
#include<cctype>
#include<cmath>
#include<iostream>
#include<sstream>
#include<iterator>
#include<algorithm>
#include<string>
#include<vector>
#include<set>
#include<map>
#include<stack>
#include<deque>
#include<queue>
#include<list>
using namespace std;
typedef long long ll;
int n,m;
int listt[11000];
queue<int> q;
int isPrime(int n)
{ //返回1表示判断为质数,0为非质数,在此没有进行输入异常检测
float n_sqrt;
if(n==2 || n==3) return 1;
if(n%6!=1 && n%6!=5) return 0;
n_sqrt=floor(sqrt((float)n));
for(int i=5;i<=n_sqrt;i+=6)
{
if(n%(i)==0 | n%(i+2)==0) return 0;
}
return 1;
}
int solve(int x)
{
//cout<<x<<endl;
if(isPrime(x)==1&&x!=n&&listt[x]==-1)
{
q.push(x);
listt[x]=listt[n]+1;
}
return 1;
}
int main()
{
int T;
cin>>T;
while(T--)
{

scanf("%d%d",&n,&m);
while(!q.empty()) q.pop();
q.push(n);
memset(listt,-1,sizeof(listt));
listt[n]=0;
while(!q.empty()&&n>1)
{
n=q.front();
q.pop();
int a1=n%10;
int a2=(n/10)%10;
int a3=(n/100)%10;
int a4=n/1000;

for(int i=1;i<10;i++) //变换第一位,首位不能是0
solve(n-a4*1000+i*1000);
for(int i=0;i<10;i++) //变化第二,三,四位
{
solve(n-a3*100+i*100);
solve(n-a2*10+i*10);
solve(n-a1+i);
}
}
cout<<listt[m]<<endl;
}
return 0;
}

 

标签:Prime,prime,digit,int,listt,3126,number,BFS,include
From: https://blog.51cto.com/u_14932227/6041973

相关文章

  • bfs 实战-求连通分量个数
    bfs即广度优先搜索,等同于树的层序遍历,下面用一个题目来讲解题目:图的广度优先遍历问题描述已知无向图的邻接矩阵,以该矩阵为基础,给出广度优先搜索遍历序列,并且给出该无向......
  • 2023牛客寒假算法基础集训营6 (B 思维+二分)(D 字符串匹配dp)(E 生成树+思维)(I 思维+
    2023牛客寒假算法基础集训营6(B思维+二分)(D字符串匹配dp)(E生成树+思维)(I思维+bfs)B阿宁的倍数题目大意:给定一个长度为n的数组a,有q次操作。修改:数组末尾增加......
  • C Primer Plus 第6版 电子书 pdf
    作者:普拉达(StephenPrata)出版社:人民邮电出版社出品方:异步图书副标题:第六版原作名:CPrimerPlus:6th译者:姜佑 关注公众号:红宸笑。回复:电子书即可 ......
  • C++ Primer 5th 阅读笔记:入门指南
    学习方法Thewaytolearnanewprogramminglanguageistowriteprograms.学习一门新编程语言的方式是编写程序。函数(Function)函数的四部分:返回类型;函数......
  • 题解 ARC155D Avoid Coprime Game
    题解ARC155DAvoidCoprimeGame题意给定一个可重集\(S\),保证\(\gcd_{x\inS}(x)=1\),维护一个初始为\(0\)的整数\(G\),双方轮流操作,每次每人选择\(S\)中一个数......
  • C++ Primer 5th 阅读笔记:前言
    机器效率和编程效率Itsfocus,andthatofitsprogrammingcommunity,haswidenedfromlookingmostlyatmachineefficiencytodevotingmoreattentiontoprogram......
  • BFS求最短路径
     加农是罪的化身,所到之处污秽遍地。原先富丽堂皇的海鲁拉城堡也被加农污秽了。根据调查,加农污秽一片地区有如下规律:下图是一个矩形区域,Y=3,X=4。 "."表示干净区域,而"......
  • 2018南京Gym - 101981J - Prime Game(计数)
    第一个元素的素因子2:它能贡献的区间有[1,1],[1,2],……,[1,10]10个区间第一个元素的素因子3:它能贡献的区间有[1,1],[1,2],……,[1,10]10个区间当前sum=10+10第二个元素......
  • C Primer Plus (7.12) 編程練習
    /*CPrimerPlus(7.11)3*/1#include<stdio.h>2intmain()3{4doubleweight,height;5printf("Pleaseenteryourweightandheight.\n");6......
  • poj 3984 迷宫问题(BFS+输出路径)
    迷宫问题TimeLimit: 1000MS MemoryLimit: 65536KTotalSubmissions: 11323 Accepted: 6776Description定义一个二维数组: intmaze[5][5]={ 0,1,......