HDU 1973 Prime path(BFS+素数表)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1973

题目大意:给定两个四位素数a  b,要求把a变换到b变换的过程要保证  每次变换出来的数都是一个 四位素数,而且当前这步的变换所得的素数

     与前一步得到的素数  只能有一个位不同,而且每步得到的素数都不能重复。求从a到b最少需要的变换次数。无法变换则输出Impossible。

     如下面的样例:1033 8179

            1033
            1733
            3733
            3739
            3779
            8779
            8179

    所以答案为6。

解题思路:bfs,枚举变换个、十、百、千这四位,从0~9,是素数就入队,不断bfs直到找出答案。要注意千位不能为0!!!

 1 #include<cstdio>
 2 #include<queue>
 3 #include<cstring>
 4 using namespace std;
 5 const int N=1e4+5;
 6
 7 int n,res,ans;
 8 int vis[N];
 9 int Pow[4]={1,10,100,1000};
10 bool prime[N];
11
12 void is_prime(){
13     for(int i=2;i<N;i++){
14         prime[i]=true;
15     }
16     for(int i=2;i*i<N;i++){
17         if(prime[i]){
18             for(int j=i*i;j<N;j+=i)
19                 prime[j]=false;
20         }
21     }
22 }
23
24 struct node{
25     int step;
26     int num;
27 }pre,now;
28
29 bool bfs(){
30     queue<node>q;
31     now.num=n;
32     now.step=0;
33     q.push(now);
34     while(!q.empty()){
35         pre=q.front();
36         q.pop();
37         int x=pre.num;
38         //枚举四位,从0~9(千位不能为0),找出素数入队,不断bfs直到找出答案
39         for(int i=0;i<4;i++){
40             for(int j=0;j<=9;j++){
41                 int t=x;
42                 if(i==0)
43                     t-=t%10*Pow[i];
44                 if(i==1)
45                     t-=t%100/10*Pow[i];
46                 if(i==2)
47                     t-=t%1000/100*Pow[i];
48                 if(i==3)
49                     t-=t/1000*Pow[i];
50                 if(i==3&&j==0)
51                     continue;
52                 t+=j*Pow[i];
53                 if(t==x||!prime[t]||vis[t])
54                     continue;
55                 if(t==res){
56                     ans=pre.step+1;
57                     return true;
58                 }
59                 vis[t]=1;
60                 now.num=t;
61                 now.step=pre.step+1;
62                 q.push(now);
63             }
64         }
65     }
66     return false;
67 }
68
69 int main(){
70     is_prime();
71     int t;
72     scanf("%d",&t);
73     while(t--){
74         memset(vis,0,sizeof(vis));
75         scanf("%d%d",&n,&res);
76         if(n==res){
77             puts("0");
78             continue;
79         }
80         ans=0;
81         if(bfs())
82             printf("%d\n",ans);
83         else
84             puts("Impossible");
85     }
86     return 0;
87 } 
时间: 2024-10-07 17:10:46

HDU 1973 Prime path(BFS+素数表)的相关文章

hdu 1973 Prime Path

题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=1973 Prime Path 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 the four-digit room numbers on their offices

HDU - 1973 - Prime Path (BFS)

Prime Path Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 987    Accepted Submission(s): 635 Problem Description The ministers of the cabinet were quite upset by the message from the Chief of S

POJ 3126 Prime Path (BFS + 素数筛)

链接 : Here! 思路 : 素数表 + BFS, 对于每个数字来说, 有四个替换位置, 每个替换位置有10种方案(对于最高位只有9种), 因此直接用 BFS 搜索目标状态即可. 搜索的空间也不大... /************************************************************************* > File Name: E.cpp > Author: > Mail: > Created Time: 2017年11月26日

HDU 1976 prime path

题意:给你2个数n m,从n变成m最少需要改变多少次. 其中: 1.n  m  都是4位数 2.每次只能改变n的一个位数(个位.十位.百位.千位),且每次改变后后的新数为素数 思路:搜索的变形题,这次我们要搜得方向是改变位数中的一位,然后往下搜,直到求出我们需要的那个解 #include<cstdio> #include<cstring> #include<algorithm> #include<queue> #include<cmath> us

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

CD0J/POJ 851/3126 方老师与素数/Prime Path BFS

Prime Path Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9982   Accepted: 5724 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 the four-digi

poj 3126 Prime Path (bfs)

Prime Path Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 13813   Accepted: 7796 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 the four-dig

HDU 1043 Eight(反向BFS+打表+康托展开)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1043 题目大意:传统八数码问题 解题思路:就是从“12345678x”这个终点状态开始反向BFS,将各个状态记录下来,因为数字太大所以用康托展开将数字离散化. 代码: 1 #include<iostream> 2 #include<algorithm> 3 #include<cstdio> 4 #include<cstring> 5 #include<st

POJ 3126 Prime Path(BFS 数字处理)

题意  给你两个4位素数a, b  你每次可以改变a的一位数但要求改变后仍为素数  求a至少改变多少次才能变成b 基础的bfs  注意数的处理就行了  出队一个数  然后入队所有可以由这个素数经过一次改变而来的素数  知道得到b #include <cstdio> #include <cstring> using namespace std; const int N = 10000; int p[N], v[N], d[N], q[N], a, b; void initPrime(