POJ 3126解题报告
来源:互联网 发布:集体智慧编程 编辑:程序博客网 时间:2024/06/07 13:35
这道题是道广搜题,因为爬虫等写过,所以队列还比较清楚,基本上就是一个set保存已访问过的(域名或这里的素数)还有一个队列保存要访问的内容。
我这里的做法是两个队列,一个队列cur保存现在正在处理的素数,另一个队列next保存处理过程中出现的新素数,也就是多一次变换之后的素数。
处理或者说变换的过程就是把每位(1~4位)从0~9都试一遍(不能和原来的数相同,且最高位不能变成0即可)。这样一直从源素数变为目标素数为止。
感觉AC了之后看代码改进代码的动力就不足了。。。一个比较容易想到的改进方法是用素数筛选法把4位数的素数筛选出来,这样也不必每算一个数都进行一次判断了。
我这个代码的memory308k,时间204ms。别人的时间都很短(我的1/10)。
代码如下:
#include <iostream>#include <vector>#include <set>#include <queue>#include <cmath>using namespace std;bool isprime(int n){for(int i = 2; i <= sqrt(double(n)); ++i){if(n % i == 0){return false;}}return true;}int primetoprime(int p1, int p2, int nb){int step = 0;set<int> visited;queue<int> cur;cur.push(p1);visited.insert(p1);while(true){queue<int> next;while(!cur.empty()){int p = cur.front();cur.pop();if(p == p2)return step;int base = 1;for(int i = 0; i < nb; ++i){int bit = (p / base) % 10;for(int j = 0; j <= 9; ++j){if(i == nb - 1 && j == 0)//the most significant bit cannot be zerocontinue;int tmp = p;if(j == bit)continue;tmp = tmp + (j - bit) * base;if(isprime(tmp) && visited.find(tmp) == visited.end()){next.push(tmp);visited.insert(tmp);}}base *= 10;}}step++;cur = next;}}int main(){int n;cin>>n;for(int i = 0; i < n; ++i){int p1, p2;cin>>p1>>p2;/*int nb = 1;int tmp = p1;while(tmp > 0){tmp /= 10;nb++;}*/cout<<primetoprime(p1, p2, 4)<<endl;}return 0;}
- POJ 3126解题报告
- POJ-3126 Prime Path 解题报告
- Prime Path(POJ 3126)解题报告
- poj解题报告——3126
- poj数百篇解题报告
- poj 1141解题报告
- poj 1001解题报告
- poj 1011 解题报告
- poj 1087 解题报告
- poj 2153解题报告
- poj 2051解题报告
- POJ 1167 解题报告
- poj 1026 解题报告
- POJ 1077 解题报告
- POJ 1042 解题报告
- POJ 1095 解题报告
- POJ 1159解题报告
- poj 2312解题报告
- mysql 的load data local infile命令
- android学习笔记之BroadcastReceiver应用详解
- 程序员面试题精选100题(55)-不用+、-、×、÷做加法
- MySQL修改字段默认值
- 读《AskForHelp——提问的智慧》感想
- POJ 3126解题报告
- MySQL修改字段允许为空
- C#序列化和反序列化 .
- 孙鑫vc++ 17 进程间通信(1)剪贴板
- 二叉树的创建,节点删除,节点增加
- oracle学习之三(多表查询)
- 合并C#生成的多个DLL解决方案
- CSDN博客中的演示动画怎么做
- ARM复习题