poj3126 - bfs
2015-12-13 16:16
225 查看
题目主要意思是,给你两个4位数的质数A,B,要将A逐步换成B,每次只能换个十百千位中的其中一位,且换后的数也必须是质数,问你,至少要换多少步,才能把A换成B
例:1033换到8179 1033 >1733 >3733 >3739 >3779 >8779 >8179
输出 6
用数组P来判断数A是否是质数,数x是质数则P[x]为0,不是质数则P[x]为1。用visit判断该数是否被访问过,layer则表示该数的步数。
先将A放入队列,然后分别枚举个十百千位,生成新转换的数,如果它没访问过,且是质数,即将它放入队列,将其置为已经访问过,并将它的步数置为换成此数前的步数+1(layer[x]即表示A转换到x所需的步数),每次都将队首的数当成要被换掉的数,并将它弹出,队列中的数的步数都是队列前面的数的步数<=队列后面的数,以此能够保证最终,当得到新生成的数恰好等于B时,A到B的步数为最小。
#include <iostream>
#include <queue> using namespace std; int vis[10000]; int p[10000]; int layer[10000]; int a, b; void prime() { p[0] = p[1] = 1; int i, j; for (i = 2; i < 10000; i++) if (p[i] == 0) for (j = i*i; j < 10000; j += i) p[j] = 1; } void init() { memset(vis, 0, sizeof(vis)); memset(layer, 0, sizeof(layer)); } int bfs() { queue<int > q; q.push(a); vis[a] = 1; layer[a] = 0; while (!q.empty()) { int cur = q.front(); int cur_copy = cur; q.pop(); int t[4]; int i; for (i = 3; i >= 0; i--) { t[i] = cur_copy % 10; cur_copy /= 10; } //枚举个位 for (i = 0; i < 10; i++) { int next = i; next += t[0] * 1000 + t[1] * 100 + t[2] * 10; if (!p[next] && !vis[next]) { q.push(next); vis[next] = 1; layer[next] = layer[cur] + 1; if (next == b) return layer[next]; } } //枚举s位 for (i = 0; i < 10; i++) { int next = i*10; next += t[0] * 1000 + t[1] * 100 + t[3]; if (!p[next] && !vis[next]) { q.push(next); vis[next] = 1; layer[next] = layer[cur] + 1; if (next == b) return layer[next]; } } //枚举b位 for (i = 0; i < 10; i++) { int next = i * 100; next += t[0] * 1000 + t[2] * 10 + t[3]; if (!p[next] && !vis[next]) { q.push(next); vis[next] = 1; layer[next] = layer[cur] + 1; if (next == b) return layer[next]; } } //枚举q位 for (i = 1; i < 10; i++) { int next = i * 1000; next += t[1] * 100 +t[2] * 10 + t[3]; if (!p[next] && !vis[next]) { q.push(next); vis[next] = 1; layer[next] = layer[cur] + 1; if (next == b) return layer[next]; } } } return -1; } int main() { prime(); int n; cin >> n; while (n--) { init(); cin >> a >> b; if (a == b) cout << 0 << endl; else { int cnt = bfs(); if (cnt == -1) cout << "Impossible" << endl; else cout << cnt << endl; } } return 0; }
相关文章推荐
- IOS开发中NSURL的基本操作及用法详解
- 【LeetCode】9 Palindrome Number
- DFS深度优先搜索算法
- 程序员编程武器大盘点
- iOS UI 12 tabbarcontroller
- AngularJS实战(七)
- 程序员编程武器大盘点
- c++异常处理 try catch
- iOS UI 12 tabbarcontroller
- Codevs_P1021 玛丽卡(Dijkstra)
- 新建用户和用户组的shell
- 将博客搬至CSDN
- 2015年12月13日 spring初级知识讲解(四)面向切面的Spring
- IL指令详细
- 判断Activity 存在的方法
- java资源定位(非web项目)
- CentOS6.5 安装vncserver实现图形化访问
- Android 自定义卫星式弧形菜单
- mysql操作与调优
- Android中网络请求放在子线程中问题