好吧 还是拖到了5.26来写本是5.25的题。。。
自我 宽恕
老样子--- 感谢 微信平台: 一天一道算法题 无聊的你 也可以去关注一下
题目 链接:http://poj.org/problem?id=3126
题目 大意: 给你2个素数 问从一个素数到另一个转换的过程中 每次只允许改变一个位上的数 并且在改动过程中 保证它也是素数 最少需要多少次实现这个转换?
ok 其实 这题 不算难 当告诉你这是个搜索以后 只是在进行个位 十位 百位 千位 上各个数字尝试的时候 可能会有点小困难吧 反正我是遇到了---------
怎么说呢 你可以选择开一个结构体 来存储 素数和步数 我还是喜欢开2个数组 来实现 随便 个人喜好问题
我被一个 素数判断函数少个 = 号 找了好久 都没发现 最后还是大神 一眼发现 流弊。。。
这里 有人会在Bfs的时候 自己模拟队列实现 而我还是喜欢直接用 stl里的queue 不会存在 数组大小问题 也感觉更容易
下面 贴上我的代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <iostream> 2 #include <cstring> 3 #include <queue> 4 using namespace std; 5 6 const int num = 10010; 7 bool vis[num]; 8 bool prime[num]; 9 int step[num]; 10 11 void judge( int n ) 12 { 13 bool flag = false; 14 for( int i = 2 ; i*i<=n ; i++ ) 15 { 16 if( n%i == 0 ) 17 { 18 flag = true; 19 break; 20 } 21 } 22 if( flag ) 23 prime[n] = true;//合数 就是 true 24 } 25 26 bool bfs( int st , int end ) 27 { 28 int temp; 29 int i; 30 int a , b; 31 queue<int>q; 32 while( !q.empty() ) 33 q.pop(); 34 q.push(st); 35 if( st==end ) 36 { 37 return true; 38 } 39 while( !q.empty() ) 40 { 41 int now = q.front(); 42 q.pop(); 43 if( now == end ) 44 return true; 45 a = now%10; //个位上的数 46 b = (now/10)%10;//十位上的数 47 //枚举个位:肯定是奇数 不然不可能是素数 48 for( i = 1 ; i<=9 ; i+=2 ) 49 { 50 temp = (now/10)*10 + i; 51 if( temp!=now && !vis[temp] && !prime[temp] ) 52 { 53 vis[temp] = true; 54 step[temp] = step[now] + 1; 55 q.push( temp ); 56 } 57 } 58 //枚举十位: 59 for( i = 0 ; i<=9 ; i++ ) 60 { 61 temp = ( now/100 )*100 + 10*i +a; 62 if( temp!=now && !vis[temp] && !prime[temp] ) 63 { 64 vis[temp] = true; 65 step[temp] = step[now] + 1; 66 q.push( temp ); 67 } 68 } 69 //枚举百位: 70 for( i = 0 ; i<=9 ; i++ ) 71 { 72 temp = ( now/1000)*1000 + 100*i + 10*b + a; 73 if( temp!=now && !vis[temp] && !prime[temp] ) 74 { 75 vis[temp] = true; 76 step[temp] = step[now] + 1; 77 q.push( temp ); 78 } 79 } 80 //枚举千位 肯定不能以0开头 81 for( i = 1 ; i<=9 ; i++ ) 82 { 83 temp = now%1000 + i*1000; 84 if( temp!=now && !vis[temp] && !prime[temp] ) 85 { 86 vis[temp] = true; 87 step[temp] = step[now] + 1; 88 q.push( temp ); 89 } 90 } 91 } 92 return false; 93 } 94 95 int main() 96 { 97 int t; 98 int st , end; 99 memset( prime , false , sizeof(prime) ); 100 for( int i = 1000 ; i<=9999 ; i++ ) 101 { 102 judge(i); 103 } 104 while( ~scanf("%d",&t) ) 105 { 106 while( t-- ) 107 { 108 memset( vis , false , sizeof(vis) ); 109 memset( step , 0 , sizeof(step) ); 110 scanf( "%d %d",&st,&end ); 111 if( bfs( st , end ) ) 112 { 113 printf( "%d ",step[end] ); 114 } 115 else 116 { 117 printf( "Impossible " ); 118 } 119 } 120 } 121 return 0; 122 }
PS:微信上说 可以用 最短路来实现 = 我今晚看有空来 去写下试下
话说 今天的算法题 又已经出来了 看来要=到 今晚 才能写了 明天又要上那 该死的高数 还有那本来很美好的C++ 被个不好的老师教的。。。。