poj-3126
来源:互联网 发布:java http multi 编辑:程序博客网 时间:2024/05/17 21:27
// 600K 16MS G++#include <cstdio>#include <queue>#include <cstring>#include <cmath>using namespace std;char compositeNum[10000];char BFSFlag[10000];void getPrime() { int max = 100; int begin = 2; while(begin <= 100) { for (int i = begin + 1; i <= 9999; i++) { if (i%begin == 0) { compositeNum[i] = 1; } } for (int i = begin + 1; i <= 999; i++) { if (compositeNum[i] == 0) { begin = i; break; } } }}int sNum;int tNum;struct BFSNode { int num; int roundNum;}; typedef struct BFSNode BFSNode;queue<BFSNode> BFSQueue;int BFS() { while(BFSQueue.size()) { BFSQueue.pop(); } memset(BFSFlag, 0, sizeof(BFSFlag)); BFSNode beignNode; beignNode.num = sNum; beignNode.roundNum = 0; BFSQueue.push(beignNode); BFSFlag[sNum] = 1; while(BFSQueue.size()) { BFSNode curNode = BFSQueue.front(); BFSQueue.pop(); int curNum = curNode.num; int curRoundNum = curNode.roundNum; //1 for (int i = 1; i <= 9; i++) { int newVal = i*1000 + curNum%1000; if (!compositeNum[newVal]) { if (newVal == tNum) { return curRoundNum+1; } else { if (!BFSFlag[newVal]) { BFSFlag[newVal] = 1; BFSNode newNode; newNode.num = newVal; newNode.roundNum = curRoundNum + 1; BFSQueue.push(newNode); } } } } //2 for (int i = 0; i <= 9; i++) { int newVal = curNum/1000 * 1000 + i*100 + curNum%100; if (!compositeNum[newVal]) { if (newVal == tNum) { return curRoundNum+1; } else { if (!BFSFlag[newVal]) { BFSFlag[newVal] = 1; BFSNode newNode; newNode.num = newVal; newNode.roundNum = curRoundNum + 1; BFSQueue.push(newNode); } } } } //3 for (int i = 0; i <= 9; i++) { int newVal = curNum/100 * 100 + i*10 + curNum %10; if (!compositeNum[newVal]) { if (newVal == tNum) { return curRoundNum+1; } else { if (!BFSFlag[newVal]) { BFSFlag[newVal] = 1; BFSNode newNode; newNode.num = newVal; newNode.roundNum = curRoundNum + 1; BFSQueue.push(newNode); } } } } //4 for (int i = 0; i <= 9; i++) { int newVal = curNum/10*10 + i; if (!compositeNum[newVal]) { if (newVal == tNum) { return curRoundNum+1; } else { if (!BFSFlag[newVal]) { BFSFlag[newVal] = 1; BFSNode newNode; newNode.num = newVal; newNode.roundNum = curRoundNum + 1; BFSQueue.push(newNode); } } } } } return -1;}void solve() { printf("%d\n", BFS());}int main() { memset(compositeNum, 0, sizeof(compositeNum)); getPrime(); // for (int i = 9000; i < 10000; i++) { // if (!compositeNum[i]) { // printf("%d\n", i); // } // } int caseNum; scanf("%d\n", &caseNum); for (int i = 1; i <= caseNum; i++) { scanf("%d %d", &sNum, &tNum); if (sNum == tNum) { printf("0\n"); } else { solve(); } }}
算是一道数论 + BFS水题。
解题之前先用素数筛子筛一遍1~10000的数,搞一个bitmap数组标示素数和非素数。
然后就简单了,BFS从给的数开始,每次有9(第一位不能是0)*10*10*10个选择,不过因为 有BFSFlag标示和可能不是素数,因此其实最后的运算量不大,
最差就是把1000~9999的数全过一遍,以遇到要转的素数结束BFS。BFSNode带上round次数,最后输出。
0 0
- POJ 3126
- poj 3126
- POJ 3126
- POJ 3126
- poj 3126
- poj 3126
- poj 3126
- POJ 3126
- poj 3126
- poj-3126
- poj 3126
- POJ 3126
- poj 3126
- 3126POJ
- poj 3126
- POJ 3126
- poj---3126
- poj 3126
- 自己根据多个例子编的光流法检测,希望大神指正
- 4G浏览器新版本发布 新增热点信息推送功能
- 一站式学习Wireshark(六):狙击网络高延时点
- 洪水攻击列举
- TreeMap
- poj-3126
- 一站式学习Wireshark(七):Statistics统计工具功能详解与应用
- nagios邮件报警设置
- android中URI到底是什么?
- IT项目带来的压力我们如何释放
- 手机调试,eclipse连接真机无log,显示log device is empty!的解决办法
- JavaScript、jQuery、Ajax以及json间的关系
- 一站式学习Wireshark(八):应用Wireshark过滤条件抓取特定数据流
- Properties