POJ 3126 primepath bfs

题目链接:http://poj.org/problem?id=3126

题意:1维的坐标轴,给出起点和终点,求从起点到终点变换经历的最短的步数。起点,终点和中间变换的数字都是4位,而且都是质数。

思路:普通的广搜、精神状态不佳、找了许久的bug。后来发现是prime函数和pow函数都很丧心病狂的写错了、

附 AC 代码:

  1 // T_T 电脑突然重启什么都没有了。。没有了、
  2 //大概4*9入口的广搜。 从初始点开始 对于每个扩展点加入队列 知道找到ed、或者尝试完所有可能的情况、
  3
  4 #include <stdio.h>
  5 #include <string.h>
  6 #include <iostream>
  7 using namespace std;
  8 #include <math.h>
  9 #define maxn 100000
 10 #include <queue>
 11 int st, ed;
 12 bool vis[10000];
 13 int step[10000];
 14
 15 int val1[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
 16 int val2[10] = {0, 10, 20, 30, 40, 50, 60, 70, 80, 90};
 17 int val3[10] = {0, 100, 200, 300, 400, 500, 600, 700, 800, 900};
 18 int val4[10] = {1000, 2000, 3000, 4000, 5000, 6000, 7000, 8000, 9000};
 19
 20 queue<int>que;
 21
 22 bool prime(int n) {
 23     for (int i=2; i<=sqrt(n); ++i) {
 24         if (n%i == 0)
 25             return false;
 26     }
 27     return true;
 28 }
 29
 30 int pow(int a, int b) {
 31     if (b == 0) return 1;
 32     for (int i=1; i<b; ++i) {
 33         a *= 10;
 34     }
 35     return a;
 36 }
 37
 38 void dfs() {
 39     memset(vis, 0, sizeof(vis));
 40     for (int i=0; i<10000; ++i) {
 41         step[i] = maxn;
 42     }
 43     while(!que.empty())
 44         que.pop();
 45     que.push(st);
 46     step[st] = 0;
 47     vis[st] = 1;
 48
 49     while(!que.empty()) {
 50         int now = que.front();
 51         que.pop();
 52         if (now == ed) {
 53             return;
 54         }
 55
 56         int temp = now;
 57         int val[4];
 58         int cnt = 0;
 59         while (temp) {
 60             val[cnt] = temp % 10;
 61             temp /= 10;
 62             val[cnt] *= pow(10, cnt);
 63             cnt++;
 64         }
 65
 66         temp = now;
 67         temp -= val[0];
 68         for (int i=0; i<10; ++i) {
 69             temp += val1[i];
 70             if (!vis[temp] && temp % 2 && temp <= ed) {
 71                 if (prime(temp)) {
 72                  step[temp] = step[now] + 1;
 73                  vis[temp] = 1;
 74                  que.push(temp);
 75                 }
 76             }
 77             temp -= val1[i];
 78         }
 79
 80         temp = now;
 81         temp -= val[1];
 82         for (int i=0; i<10; ++i) {
 83             temp += val2[i];
 84             if (!vis[temp] && temp % 2) {
 85                 if (prime(temp)) {
 86                  step[temp] = step[now] + 1;
 87                  vis[temp] = 1;
 88                  que.push(temp);
 89                 }
 90             }
 91             temp -= val2[i];
 92         }
 93
 94         temp = now;
 95         temp -= val[2];
 96         for (int i=0; i<10; ++i) {
 97             temp += val3[i];
 98             if (!vis[temp] && temp % 2) {
 99                 if (prime(temp)) {
100                  step[temp] = step[now] + 1;
101                  vis[temp] = 1;
102                  que.push(temp);
103                 }
104             }
105             temp -= val3[i];
106         }
107
108         temp = now;
109         temp -= val[3];
110
111         for (int i=0; i<9; ++i) {
112             temp += val4[i];
113             if (!vis[temp] && temp % 2) {
114                 if (prime(temp)) {
115                  step[temp] = step[now] + 1;
116                  vis[temp] = 1;
117                  que.push(temp);
118                 }
119             }
120             temp -= val4[i];
121         }
122     }
123     return;
124 }
125
126 int main() {
127     int t;
128     cin >> t;
129     while(t--) {
130         cin >> st >> ed;
131         dfs();
132         int ans = step[ed];
133         if (ans == maxn) {
134             cout << "Impossible\n";
135         }
136         else cout << ans << endl;
137     }
138     return 0;
139 }

时间: 2024-10-13 05:08:44

POJ 3126 primepath bfs的相关文章

F - Prime Path POJ 3126 筛选素数+bfs

F - Prime Path Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Submit Status Practice POJ 3126 Description The ministers of the cabinet were quite upset by the message from the Chief of Security stating that they would all have t

poj 3126 Prime Path 【暴力BFS】

题意:给你一个4位数,再给你一个4位数,如前一个数的每次只移动一位,问你能不能将第一个数变成第二个. 转移条件:1,只能通过素数作为中转,2,每次移动一位. 如果找到输出最少的转移次数(或步数), 如果找不到输出Impossible. 策略:如题. 直接上代码: #include<stdio.h> #include<string.h> #include<queue> #define M 10005 using std::queue; int vis[10000]; in

POJ - 3126 - Prime Path(BFS)

Prime Path POJ - 3126 题意: 给出两个四位素数 a , b.然后从a开始,每次可以改变四位中的一位数字,变成 c,c 可以接着变,直到变成b为止.要求 c 必须是素数.求变换次数的最小值.(a,b,c都是四位数字,输入时没有前导零) 分析: 每次改变可以获得一个四位数c,然后如果c是素数并且之前没有出现过,那么我们把它放入队列即可. int f[10001]; int v[10001]; void init()//素数筛 { memset(f,0,sizeof f); fo

双向广搜 POJ 3126 Prime Path

POJ 3126  Prime Path Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 16204   Accepted: 9153 Description The ministers of the cabinet were quite upset by the message from the Chief of Security stating that they would all have to change th

POJ 3126 Prime Path(素数路径)

p.MsoNormal { margin-bottom: 10.0000pt; font-family: Tahoma; font-size: 11.0000pt } h1 { margin-top: 5.0000pt; margin-bottom: 5.0000pt; text-align: left; font-family: 宋体; font-weight: bold; font-size: 24.0000pt } span.10 { font-family: "Times New Rom

POJ 3126 Prime Path SPFA

http://poj.org/problem?id=3126 题目大意: 给你两个四位的素数s和t,要求每次改变一个数字,使得改变后的数字也为素数,求s变化到t的最少变化次数. 思路: 首先求出所有4位素数. 对于两个素数之间,如果只相差一个数字,那么就建立图,(双向) 最后求最短路即可(可以SPFA也可以BFS) #include<cstdio> #include<cstring> #include<queue> #include<algorithm> u

20200202 POJ - 3126 Prime Path POJ - 1426 Find The Multiple

>>>>>>>>>POJ 1426直达?? >>>>>>>>>POJ 3126直达?? 做了这么几道搜索题,感觉差不多也摸出了门路,模板差不多记下来了,只是面对不同的题目算法不同罢了 简单写一下想法,搞明白搜索的主题到底是什么(之前的mutiple那题,一开始就没想明白到底搜谁,就没想到算法 TBC(晚上再写 ===================================分割线=======

poj 1724 ROADS (bfs+优先队列)

题目链接 题意:在有费用k限制的条件下,求从1到n的最短距离,如果最短距离相同求费用最小的,边为有向边,其中可能有 多个相同的源点和目标点,但是距离和费用不同. 分析:用bfs和邻接表来把每一个边搜一下,因为用了优先队列,所以先到n的一定是最小的 . 1 #include <iostream> 2 #include <cstring> 3 #include <cstdlib> 4 #include <cmath> 5 #include <cstdio&

POJ 3287 (基础BFS) Catch That Cow

这是做的第一道BFS,很基础很简单的题目 广度优先搜索算法如下:(用QUEUE)(1) 把初始节点S0放入Open表中:(2) 如果Open表为空,则问题无解,失败退出:(3) 把Open表的第一个节点取出放入Closed表,并记该节点为n:(4) 考察节点n是否为目标节点.若是,则得到问题的解,成功退出:(5) 若节点n不可扩展,则转第(2)步:(6) 扩展节点n,将其不在Closed表和Open表中的子节点(判重)放入Open表的尾部,并为每一个子节点设置指向父节点的指针(或记录节点的层次)