poj 3126 Prime Path
大致题意:
给定两个四位素数a b,要求把a变换到b
变换的过程要保证 每次变换出来的数都是一个 四位素数,而且当前这步的变换所得的素数 与 前一步得到的素数 只能有一个位不同,而且每步得到的素数都不能重复。
求从a到b最少需要的变换次数。无法变换则输出Impossible
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 9564 | Accepted: 5497 |
Description
![](/assets/blank.gif)
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
Output
Sample Input
3 1033 8179 1373 8017 1033 1033
Sample Output
6 7 0 我用的STL的queue和BFS代码如下:
1 #include<stdio.h> 2 #include<string.h> 3 #include<stdlib.h> 4 #include<queue> 5 using namespace std; 6 queue<struct node>que; 7 8 struct node 9 { 10 int prime; 11 int step; 12 }; 13 14 int n,m; 15 int vis[15000]; 16 int prim(int digit) 17 { 18 if(digit==2 || digit==3) 19 return 1; 20 else if(digit<=1 || digit%2==0) 21 return 0; 22 else if(digit>3) 23 { 24 for(int i=3; i*i<=digit; i+=2) 25 if(digit%i==0) 26 return 0; 27 return 1; 28 } 29 } 30 31 int bfs() 32 { 33 int i; 34 struct node k; 35 while(!que.empty()) 36 que.pop(); 37 k.prime=n; 38 k.step=0; 39 que.push(k); 40 vis[n]=1; 41 while(!que.empty()) 42 { 43 struct node s=que.front(); 44 que.pop(); 45 if(s.prime==m) 46 { 47 printf("%d\n",s.step); 48 return 0; 49 } 50 int x=s.prime%10; 51 int y=(s.prime/10)%10; 52 for(i=1; i<=9; i+=2) 53 { 54 int a=(s.prime/10)*10+i; 55 if(a!=s.prime&&!vis[a]&&prim(a)) 56 { 57 vis[a]=1; 58 k.prime=a; 59 k.step=s.step+1; 60 que.push(k); 61 } 62 } 63 for(i=0; i<=9; i++) //枚举十位 64 { 65 int a=(s.prime/100)*100+i*10+x; 66 if(a!=s.prime && !vis[a] &&prim(a)) 67 { 68 vis[a]=1; 69 k.prime=a; 70 k.step=s.step+1; 71 que.push(k); 72 } 73 } 74 75 for(i=0; i<=9; i++) //枚举百位 76 { 77 int a=(s.prime/1000)*1000+i*100+y*10+x; 78 if(a!=s.prime&&vis[a]==0&&prim(a)) 79 { 80 vis[a]=1; 81 k.prime=a; 82 k.step=s.step+1; 83 que.push(k); 84 } 85 } 86 for(i=1; i<=9; i++) //枚举的千位,保证四位数,千位最少为1 87 { 88 int a=s.prime%1000+i*1000; 89 if(a!=s.prime && !vis[a] && prim(a)) 90 { 91 vis[a]=1; 92 k.prime=a; 93 k.step=s.step+1; 94 que.push(k); 95 } 96 } 97 } 98 printf("Impossible\n"); 99 return 0; 100 } 101 int main() 102 { 103 int t; 104 scanf("%d",&t); 105 while(t--) 106 { 107 scanf("%d %d",&n,&m); 108 memset(vis,0,sizeof(vis)); 109 bfs(); 110 } 111 return 0; 112 }
转载于:https://www.cnblogs.com/mafangfang/p/3287267.html
poj 3126 Prime Path相关推荐
- POJ 3126 - Prime Path + Python(BFS)
()原题链接: # 原题:POJ 3126 - Prime Path | 眈眈探求 # 解题思路:https://blog.csdn.net/LYHVOYAGE/article/details/182 ...
- POJ - 3126 - Prime Path(BFS)
Prime Path POJ - 3126 题意: 给出两个四位素数 a , b.然后从a开始,每次可以改变四位中的一位数字,变成 c,c 可以接着变,直到变成b为止.要求 c 必须是素数.求变换次数 ...
- POJ 3126 Prime Path(BFS 数字处理)
意甲冠军 给你两个4位质数a, b 每次你可以改变a个位数,但仍然需要素数的变化 乞讨a有多少次的能力,至少修改成b 基础的bfs 注意数的处理即可了 出队一个数 然后入队全部能够由这个素 ...
- POJ 3126 Prime Path(BFS + 素数打表)
题意:给定两个四位素数, 从一个素数到另一个素数,最少用几步,可以一次更改四位中的任意一位,但每次改变都只能是素数. 解题思路:四位数每一位情况有十种情况0-9, 四位共有40种情况, 枚举40种情况 ...
- POJ 3126 Prime Path 简单广搜(BFS)
题意:一个四位数的质数,每次只能变换一个数字,而且变换后的数也要为质数.给出两个四位数的质数,输出第一个数变换为第二个数的最少步骤. 利用广搜就能很快解决问题了.还有一个要注意的地方,千位要大于0.例 ...
- POJ 3126 Prime Path(筛法,双向搜索)
题意:一个4位的素数每次变动一个数位,中间过程也要上素数,问变成另一个的最小步数. 线性筛一遍以后bfs就好.我写的双向,其实没有必要. #include<cstdio> #include ...
- POJ 3126 Prime Path BFS搜索
题意:就是找最短的四位数素数路径 分析:然后BFS随便搜一下,复杂度最多是所有的四位素数的个数 #include<cstdio> #include<algorithm> #in ...
- POJ 3126 Prime Path
水题:直接判断素数+bfs 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #in ...
- Prime Path POJ - 3126
题目链接:Prime Path POJ - 3126 =================================================== Prime Path Time Limit ...
最新文章
- python简易版实例_Python3之简单搭建自带服务器的实例讲解
- C#拉姆达(=)表达式
- Http协议中Get和Post的浅谈
- VC,VB程序button、图标样式美化
- 旅行场景下的个性化营销平台揭秘
- 欧姆龙plc解密实例_西门子、施耐德、欧姆龙等13大PLC品牌8000个实例程序资料包...
- 华为鸿蒙一再延期,华为P50再次延期,鸿蒙系统正式版加持,有望与新平板一同登场...
- 蓝桥杯基础模块4_3:矩阵按键
- (3.4)HarmonyOS鸿蒙滑动事件三个动作
- 公开课 | 知识图谱构建与应用概述
- git 实践之冲突管理
- 实验4-1-2 求奇数和 (15 分)
- juc包下四大并发工具
- 开发者的实用 Vim 插件(二)
- js去空格、去重函数
- 用Python合并文件夹下所有pdf文件(包括多级子目录下的pdf文件)
- 番茄助手在VS2017中的设置
- java自行车销售系统_基于 javaee 自行车租赁系统,源码分享
- 不同时区时间换算_世界时间换算(全球时间对照表)
- Windows现漏洞 可绕过AppLocker白名单实施攻击