题目描述
发明一种方案,把一个四位数质数变到另一个四位数质数,路径中每次只改变一个数字,每次改变后的四位数也是质数。
一个数字的价格是一磅,找到在两个给定的四位数素数之间最便宜的素数路径,第一位必须为非零。
例如1033->8179的质数路径:
1033->1733->3733->3739->3779->8779->8179
该解决方案的成本为6磅。
请注意,在步骤2中粘贴的数字1不能在最后一步中重复使用-必须购买新的1。

输入
一行带有正数:测试用例的数量(最多100个)。然后,对于每个测试用例,用两个数字用空格分隔的一行。
这两个数字都是四位数的质数(无前导零)。

输出
每种情况只用一行,或者用数字表示最低费用,或包含“Impossible”一词。

样本输入

3
1033 8179
1373 8017
1033 1033

样本输出

6
7
0

题目思路

将初始的四位数拆分成各个位数上的数字a,b,c,d,分别为千位、百位、十位、个位。
据题意可知,千位数不可为0,所以在千位数替换时从 1-9,替换的数字不能为原数字。
其他位数则可以选取 0-9 之间的数字替换。
替换之后,再将各个数字乘位数得到新的四位数检查是否为质数,且必须是之前没有变换到的数(用vis[]数组检查状态)。
如果满足这两个条件则可以入队,花费+1,继续下一次替换直到替换到终态。

代码如下:

#include<queue>
#include<iostream>
#include<cstdio>
#include<cstring>
#define fio ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
using namespace std;
struct node {int num;int ans;
}t1, t2;
int t, start, e, flag;
queue<node> q;
bool vis[10005];
int check(int n) {if (n <= 1) return 0;for (int i = 2; i*i <= n; i++)if (n%i == 0) return 0;return 1;
}
void bfs(int start, int e) {t1.num = start;t1.ans = 0;vis[t1.num] = 1;q.push(t1);while (!q.empty()) {t1 = q.front();  q.pop();int temp,a,b,c,d;for (int i = 0; i < 4; i++) {d = t1.num%10;c = t1.num/10%10;b = t1.num/100%10; a = t1.num/1000;if (i == 0) {for(int j = 1; j <= 9; j++) {if (j != a) {temp = j*1000+b*100+c*10+d;if (check(temp) && !vis[temp]) {t2.num = temp;t2.ans = t1.ans+1;if (t2.num == e) {flag = 1;printf("%d\n", t2.ans);return;}vis[t2.num] = 1;q.push(t2);}}}} if (i == 1) {for (int j = 0; j <= 9; j++) {if (j != b) {temp = a*1000+j*100+c*10+d;if (check(temp) && !vis[temp]) {t2.num = temp;t2.ans = t1.ans+1;if (t2.num == e) {flag = 1;printf("%d\n", t2.ans);return;}vis[t2.num] = 1;q.push(t2);}}}}if (i == 2) {for (int j = 0; j <= 9; j++) {if (j != c) {temp = a*1000+b*100+j*10+d;if (check(temp) && !vis[temp]) {t2.num = temp;t2.ans = t1.ans+1;if (t2.num == e) {flag = 1;printf("%d\n", t2.ans);return;}vis[t2.num] = 1;q.push(t2);}}}}if (i == 3) {for (int j = 0; j <= 9; j++) {if (j != d) {temp = a*1000+b*100+c*10+j;if (check(temp) && !vis[temp]) {t2.num = temp;t2.ans = t1.ans+1;if (t2.num == e) {flag = 1;printf("%d\n", t2.ans);return;}vis[t2.num] = 1;q.push(t2);}}}}}   }
}
int main() {scanf("%d", &t);while (t--) {scanf("%d%d", &start, &e);memset(vis, 0, sizeof(vis));while (!q.empty()) q.pop();if (start == e) {printf("0\n");} else {flag = 0;bfs(start, e);if (flag == 0) printf("Impossible\n");}}
}

ac,如果有错误请各位大佬指出~

POJ 3126-Prime Path相关推荐

  1. POJ 3126 - Prime Path + Python(BFS)

    ()原题链接: # 原题:POJ 3126 - Prime Path | 眈眈探求 # 解题思路:https://blog.csdn.net/LYHVOYAGE/article/details/182 ...

  2. POJ - 3126 - Prime Path(BFS)

    Prime Path POJ - 3126 题意: 给出两个四位素数 a , b.然后从a开始,每次可以改变四位中的一位数字,变成 c,c 可以接着变,直到变成b为止.要求 c 必须是素数.求变换次数 ...

  3. POJ 3126 Prime Path(BFS 数字处理)

    意甲冠军  给你两个4位质数a, b  每次你可以改变a个位数,但仍然需要素数的变化  乞讨a有多少次的能力,至少修改成b 基础的bfs  注意数的处理即可了  出队一个数  然后入队全部能够由这个素 ...

  4. POJ 3126 Prime Path(BFS + 素数打表)

    题意:给定两个四位素数, 从一个素数到另一个素数,最少用几步,可以一次更改四位中的任意一位,但每次改变都只能是素数. 解题思路:四位数每一位情况有十种情况0-9, 四位共有40种情况, 枚举40种情况 ...

  5. poj 3126 Prime Path

    看题目... 看解题报告... 敲.... 题意转自:優YoU  http://user.qzone.qq.com/289065406/blog/1303623014 大致题意: 给定两个四位素数a  ...

  6. POJ 3126 Prime Path 简单广搜(BFS)

    题意:一个四位数的质数,每次只能变换一个数字,而且变换后的数也要为质数.给出两个四位数的质数,输出第一个数变换为第二个数的最少步骤. 利用广搜就能很快解决问题了.还有一个要注意的地方,千位要大于0.例 ...

  7. POJ 3126 Prime Path(筛法,双向搜索)

    题意:一个4位的素数每次变动一个数位,中间过程也要上素数,问变成另一个的最小步数. 线性筛一遍以后bfs就好.我写的双向,其实没有必要. #include<cstdio> #include ...

  8. POJ 3126 Prime Path BFS搜索

    题意:就是找最短的四位数素数路径 分析:然后BFS随便搜一下,复杂度最多是所有的四位素数的个数 #include<cstdio> #include<algorithm> #in ...

  9. POJ 3126 Prime Path

    水题:直接判断素数+bfs 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #in ...

  10. Prime Path POJ - 3126

    题目链接:Prime Path POJ - 3126 =================================================== Prime Path Time Limit ...

最新文章

  1. 最全中文leetcode解题攻略:思路知识点代码...搞定AI大厂笔试
  2. 如何确定SharePoint 2007的一次增量爬网会处理多少条更新呢?
  3. Navicat Mac 虚拟组和连接颜色的作用
  4. 【正则表达式】1.入门
  5. node.js入门系列(一)--Node.js简介
  6. Qt for Python之 PySide2+QML 入门示例
  7. 计算机科学与技术研究目的,计算机科学与技术专业培养目标分析
  8. 在c语言中引用数组元素时,其数组下标的数据类型允许是什么
  9. BootStrap笔记-文本颜色链接颜色背景颜色
  10. python分解word文档为多个_用python批量处理word文档
  11. 工厂模式和策略模式区别
  12. 阿里云高级专家王林平:云数据库的运维体系构建
  13. mongodb默认的用户名密码_Linux如何安装、运行MongoDB教程
  14. python压缩HTML文件,python压缩javascript文件代码
  15. aria2linux安装教程,Ubuntu 安装下载工具 Aria2
  16. BOSS直聘免费下载个人简历为PDF的方法
  17. 《Thinking in UML》学习1——参与者与用例
  18. 交换芯片CPSS-MARVELL 98DXX交换处理流程
  19. linux cp dd 不同文件系统,根文件系统的制作
  20. P4322 [JSOI2016]最佳团体(分数规划树上背包)

热门文章

  1. 一步一步做搜索(一)
  2. Javascript document对象常用的方法和属性
  3. Silverlight使用DataGrid的模板列(DataGridTemplateColumn)实现类似TreeListView控件的效果
  4. fastboot devices 找不到设备_处理工业废气找不到好设备?您应该了解一下工业静电油烟净化器...
  5. mysql 排序字段索引吗_Mysql 排序优化与索引使用(转)
  6. 战神背光键盘如何关系_谁说轻薄和性能不可兼得?神舟战神Z7助你“清凉”一夏...
  7. java 动手动脑之父子继承
  8. weblogic服务器连接池配置细节
  9. Jmeter(二)关联
  10. Android 多线程断点下载(非原创)