Poj 3126 Prime Path
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Poj 3126 Prime Path相关的知识,希望对你有一定的参考价值。
1 #include <iostream> 2 #include <queue> 3 #include <cstring> 4 #include <cmath> 5 #include <string> 6 #define CLR(arr) memset(arr,0,sizeof(arr)) 7 #define N 10005 8 using namespace std; 9 string s, e; 10 bool vis[N]; 11 bool prime[N]; 12 struct node 13 { 14 string num; 15 int s; 16 }; 17 void inti(){ 18 int n = sqrt(N)+1; 19 prime[1] = true; 20 for (int i = 2; i < n; i++){ 21 for (int j = 2*i; j < N; j += i){ 22 prime[j] = true; 23 } 24 } 25 } 26 int bfs(){ 27 queue<node> q; 28 node p = {s,0}, t; 29 q.push(p); 30 vis[(s[0] - ‘0‘) * 1000 + (s[1] - ‘0‘) * 100 + (s[2] - ‘0‘) * 10 + s[3] - ‘0‘] = true; 31 while (!q.empty()){ 32 p = q.front(); q.pop(); 33 if (p.num == e)return p.s; 34 for (int i = 0,pow=1000; i < 4; i++,pow/=10){ 35 int cur = (p.num[0] - ‘0‘)*1000 + (p.num[1] - ‘0‘)*100 + 36 (p.num[2] - ‘0‘)*10 +(p.num[3] - ‘0‘) - (p.num[i] - ‘0‘)*pow; 37 for (char c = i==0?‘1‘:‘0‘; c <= ‘9‘; c++){ 38 39 if (p.num[i] != c&&vis[cur+pow*(c-‘0‘)]==false&&prime[cur+pow*(c-‘0‘)]==false){ 40 vis[cur + pow*(c - ‘0‘)] = true; 41 t.num = p.num; t.num[i] = c; 42 t.s = p.s + 1; 43 q.push(t); 44 //cout <<‘#‘<< t.num << endl; 45 } 46 } 47 } 48 } 49 return -1; 50 } 51 int main() 52 { 53 int n; 54 cin>>n; 55 inti(); 56 while (n--){ 57 cin >> s >> e; 58 int ans = bfs(); 59 if (ans!=-1)printf("%d\n", ans); 60 else printf("Impossible\n"); 61 CLR(vis); 62 } 63 return 0; 64 }
题目大意是给出两个四位素数,让你通过每次改变其中一位数的操作,来将a变成b,并且过程中所有的数都是无前导0的4为素数,(题面我真的吐槽不能啊,傲娇的prime一定要prime。。。。)
这题感觉和poj1426很像。也是通过某种操作得到一颗解答树,然后对其进行bfs。
用字符串(整数也可以,但我觉得实现起来比较麻烦)来保存数,并记录操作次数,来作为结点。此外,判断素数要打表,因为数据小,于是用了最简单的那种。复习了一下。
以上是关于Poj 3126 Prime Path的主要内容,如果未能解决你的问题,请参考以下文章