poj 3126 Prime Path (bfs)
2015-10-13 10:08
489 查看
一学期前看题解敲的:
一学期后自己写的:
说明还是有提高的。。。多复习。
#include<iostream> #include<queue> #include<cstring> #include<cstdlib> #include<cmath> using namespace std; int n; int prime[10010] = {0}; int book[10010]; int step[10010]; int bfs(int sou, int des) { queue<int> q; memset(book, 0, sizeof(book)); memset(step, 0, sizeof(step)); q.push(sou); book[sou] = 1; while(!q.empty()) { int x = q.front(); q.pop(); int t[4]; t[0] = x / 1000; t[1] = x % 1000 / 100; t[2] = x % 100 / 10; t[3] = x % 10; int i, j, tmp; for(i = 0; i < 4; i++) { tmp = t[i]; for(j = 0; j < 10; j++) { if(tmp != j) { t[i] = j; int y = t[3] + t[2] * 10 + t[1] * 100 + t[0] * 1000; if(!book[y] && prime[y]) { q.push(y); step[y] = step[x] + 1; book[y] = 1; } if(y == des) return step[y]; } } t[i] = tmp; } if(x == des) return step[x]; } return -1; } int main() { prime[0] = prime[1] = 1; int i, j; for(i = 0; i < 10010; i++) { prime[i] = 1; } for(i = 2; i <= sqrt(10010.0); i++) { if(prime[i]) { for(j = i + i; j < 10010; j += i) { prime[j] = 0; } } } for(i = 0; i < 1000; i++) { prime[i] = 0; } cin >> n; while(n--) { int a, b; cin >> a >> b; int t = bfs(a, b); if(t == -1) cout << "Impossible" << endl; else cout << t << endl; } return 0; }
一学期后自己写的:
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <queue> #include <cmath> using namespace std; int isprime[10010]; int vis[10010]; void init() { int i, j; for(i = 0; i < 10000; i++) { isprime[i] = 1; } isprime[0] = isprime[1] = 0; for(i = 2; i <= sqrt(10000); i++) { if(isprime[i] == 1) { for(j = i + i; j < 10000; j += i) { isprime[j] = 0; } } } for(i = 0; i <= 999; i++) { isprime[i] = 0; } } int a, b; struct node { int num, step; }; int bfs() { queue<node> q; node now, next; now.num = a, now.step = 0; q.push(now); vis[now.num] = 1; while(!q.empty()) { now = q.front(); q.pop(); int i, j; if(now.num == b) { return now.step; } for(i = 0; i < 4; i++) { for(j = 0; j <= 9; j++) { if(now.num % (int)pow(10, i + 1) / (int)pow(10, i) == j) continue; int t1 = now.num / (int)pow(10, i + 1); int t2 = now.num % (int)pow(10, i); next.num = t1 * (int)pow(10, i + 1) + j * (int)pow(10, i) + t2; next.step = now.step + 1; if(vis[next.num] == 0 && isprime[next.num] == 1) { vis[next.num] = 1; q.push(next); } } } } return -1; } int main() { init(); int n; scanf("%d", &n); while(n--) { memset(vis, 0, sizeof(vis)); scanf("%d %d", &a, &b); printf("%d\n", bfs()); } return 0; }
说明还是有提高的。。。多复习。
相关文章推荐
- vim插件汇总
- sql sever 数据表
- 【线性代数】 03 - 行列式
- demo02
- HttpClient容易忽视的细节——连接关闭,使用不当服务器会出现大量的Close_Wait现象
- 1588: [HNOI2002]营业额统计
- 修改MAC过程
- stl之map容器的原理及应用
- python之函数用法__str__()
- 分享一个不错的mysql语句
- Tomcat 启动时 There is no Action mapped for namespace [/] and action name [] associated with context pa
- Tomcat 启动时 There is no Action mapped for namespace [/] and action name [] associated with context pa
- Tomcat 启动时 There is no Action mapped for namespace [/] and action name [] associated with context pa
- border-style有哪些值?这些值的作用
- 标准模板库(六):STL算法函数介绍
- VS2013常用快捷键
- C++中的顶层const和底层const
- 数据结构复习1——链表反转
- poj 1426
- UISearchController