今天这题算是巩固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 }