PRIME PATH

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);
             }
              
         }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

T技术沙龙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值