http://acm.sdibt.edu.cn/JudgeOnline/problem.php?id=1450
输入:
两个素数s和e(1000<s,e<9999)
输出:
每次改变一位(要求生成的数也为素数且最高位非0),输出s到e的改变的最小次数。
解题思路:
1.经典的bfs,当某一个节点的值第一次等于e的时候即为所求,且一定改变次数最小。
2.用两个队列,队列1存解空间树的奇数层节点,队列2存解空间树的偶数层节点。
3.两个队列循环出队列,入队列,队列1出的时候生成的节点全部入队列2,队列2出的时候生成的节点全部入队列1。当队列1或队列2空的时候步数加1。
核心代码:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
|
q1.push(s); isvis[s]= true ; while (!q1.empty()) { while (!q1.empty()) { tmp=q1.front(); q1.pop(); if (tmp==e) { flag= true ; break ; } for (j=0;j<4;j++) { dat[j]=tmp%10; tmp/=10; } for (j=0;j<4;j++) { tmp=0; for (k=0;k<4;k++) if (k!=j) tmp+=dat[k]* pow (( double )10,( double )k); for (k=0;k<=9;k++) { tmp+=k* pow (( double )10,( double )j); if (v[tmp]== false &&tmp>1000&&isvis[tmp]== false ) { q2.push(tmp); isvis[tmp]= true ; } tmp-=k* pow (( double )10,( double )j); } } } if (flag== true ) break ; cnt++; while (!q2.empty()) { tmp=q2.front(); q2.pop(); q1.push(tmp); } } |
原文地址:http://blog.csdn.net/mmoaay/article/details/40395431