今天这题算是巩固BFS了,昨天的经验是把“判断”转到一个位置,就能大幅度提高效率,今天更奇葩,我按照昨天总结的“完善”的方法,超了一次又一次时,仿佛昨天都是浮云。最后又把判断移了一个位置,奇迹出现了,从TLE变为16ms,难怪说搜索的效率都很低,今天算是明白了。

 1 #include <stdio.h>
 2 #include <string.h>
 3 bool isprime[10005],vis[10005];
 4 int a,b,step[4000],d[4];
 5 int head,end,q[4000];
 6 int bfs()
 7 {
 8     int m,n,i,j;
 9     head = end = 0;
10     q[0] = a;
11     vis[a] = 1;
12     step[0] = 0;
13     while(head <= end)
14     {
15         m = q[head];
16         d[0] = m %10;
17         d[1] = m %100 /10;
18         d[2] = m %1000 /100;
19         d[3] = m /1000;
20         for(i = 0; i < 4; i++)
21             for(j = 0; j < 10; j++)
22             {
23                 d[i] = (++d[i]) %10;
24                 if(!d[3]) continue;
25                 n = d[3]*1000 + d[2]*100 + d[1]*10 + d[0];
26                 if(isprime[n] && !vis[n])
27                 {
28                     if(n == b)
29                         return step[head]+1;
30                     q[++end] = n;
31                     step[end] = step[head]+1;
32                     vis[n] = 1;
33                 }
34             }
35         head++;
36     }
37     return -1;
38 }
39 int main()
40 {
41     int i,j,n,ans;
42     memset(isprime,1,sizeof(vis));
43     isprime[1] = 0;
44     for(i = 2; i < 100; i++)
45         if(isprime[i])
46         for(j = i*i; j < 10005; j += i)
47             isprime[j] = 0;
48     ~scanf("%d",&n);
49     while(n--)
50     {
51         scanf("%d%d",&a,&b);
52         if(a == b)
53         printf("0\n");
54         else
55         {
56         memset(vis,0,sizeof(vis));
57         ans = bfs();
58         printf("%d\n",ans);}
59     }
60     return 0;
61 }