转载请注明出处:優YoU http://user.qzone.qq.com/289065406/blog/1303623014
大致题意:
给定两个四位素数a b,要求把a变换到b
变换的过程要保证 每次变换出来的数都是一个 四位素数,而且当前这步的变换所得的素数 与 前一步得到的素数 只能有一个位不同,而且每步得到的素数都不能重复。
求从a到b最少需要的变换次数。无法变换则输出Impossible
解题思路:
超级水题,40入口的BFS + 素数判定
不过剪枝之后就没有40入口了,入口数远小于40
无论是判定素数还是搜索素数,首先排除偶数,这样就剪掉一半枝叶了
判断素数用根号法判断,
如果一个数X不能被 [2,√X] 内的所有素数整除,那么它就是素数
可以判断的复杂度降到logn
注意:千位的变换要保证千位不为0
其实素数也是用来辅助搜索剪枝的
1 //Memory Time
2 //212K 16MS
3
4 #include<iostream>
5 using namespace std;
6
7 typedef class
8 {
9 public:
10 int prime;
11 int step;
12 }number;
13
14 bool JudgePrime(int digit)
15 {
16 if(digit==2 || digit==3)
17 return true;
18 else if(digit<=1 || digit%2==0)
19 return false;
20 else if(digit>3)
21 {
22 for(int i=3;i*i<=digit;i+=2)
23 if(digit%i==0)
24 return false;
25 return true;
26 }
27 }
28
29 int a,b;
30 bool vist[15000];
31 number queue[15000];
32
33 void BFS(void)
34 {
35 int i; //temporary
36 int head,tail;
37 queue[head=tail=0].prime=a;
38 queue[tail++].step=0;
39 vist[a]=true;
40
41 while(head<tail)
42 {
43 number x=queue[head++];
44 if(x.prime==b)
45 {
46 cout<<x.step<<endl;
47 return;
48 }
49
50 int unit=x.prime%10; //获取x的个位
51 int deca=(x.prime/10)%10; //获取x的十位
52
53 for(i=1;i<=9;i+=2) //枚举x的个位,保证四位数为奇数(偶数必不是素数)
54 {
55 int y=(x.prime/10)*10+i;
56 if(y!=x.prime && !vist[y] && JudgePrime(y))
57 {
58 vist[y]=true;
59 queue[tail].prime=y;
60 queue[tail++].step=x.step+1;
61 }
62 }
63 for(i=0;i<=9;i++) //枚举x的十位
64 {
65 int y=(x.prime/100)*100+i*10+unit;
66 if(y!=x.prime && !vist[y] && JudgePrime(y))
67 {
68 vist[y]=true;
69 queue[tail].prime=y;
70 queue[tail++].step=x.step+1;
71 }
72 }
73 for(i=0;i<=9;i++) //枚举x的百位
74 {
75 int y=(x.prime/1000)*1000+i*100+deca*10+unit;
76 if(y!=x.prime && !vist[y] && JudgePrime(y))
77 {
78 vist[y]=true;
79 queue[tail].prime=y;
80 queue[tail++].step=x.step+1;
81 }
82 }
83 for(i=1;i<=9;i++) //枚举x的千位,保证四位数,千位最少为1
84 {
85 int y=x.prime%1000+i*1000;
86 if(y!=x.prime && !vist[y] && JudgePrime(y))
87 {
88 vist[y]=true;
89 queue[tail].prime=y;
90 queue[tail++].step=x.step+1;
91 }
92 }
93
94 }
95
96 cout<<"Impossible"<<endl;
97 return;
98 }
99
100 int main(void)
101 {
102 int test;
103 cin>>test;
104 while(test--)
105 {
106 cin>>a>>b;
107 memset(vist,false,sizeof(vist));
108 BFS();
109 }
110 return 0;
111 }