Description
1033The cost of this solution is 6 pounds. Note that the digit 1 which got pasted over in step 2 can not be reused in the last step – a new 1 must be purchased.
1733
3733
3739
3779
8779
8179
Input
Output
Sample Input
3 1033 8179 1373 8017 1033 1033
Sample Output
6 7 0
Source
#include<cstdio> #include<cstring> #include<algorithm> #include<queue> using namespace std; const int MAX = 10000; bool prime[MAX]; void pri() { int i,j; for( i = 1000; i < MAX; i++){ for( j = 2; j < i;j++){ if(i%j == 0){ prime[i] = false; break;} } if( i == j) prime[i] = true; } } int d[5]; int num[MAX],k[MAX]; int bfs(int first,int last) { int vis; memset(num,0,sizeof(num)); memset(k,-1,sizeof(k)); queue <int> q; while(!q.empty()) q.pop(); q.push(first); k[first] = 0; while(!q.empty()){ int now = q.front(); q.pop(); d[0] = now/1000; d[1] = now%1000/100; d[2] = now%100/10; d[3] = now%10; for(int i = 0; i <4; i++){ int temp = d[i]; for(int j = 0; j <= 9;j++){ if(d[i] == j) continue; d[i] = j; vis = d[0]*1000+d[1]*100+d[2]*10+d[3]; if(prime[vis] == true && k[vis] == -1){ q.push(vis); k[vis] = 0; num[vis] = num[now] + 1; } if(vis == last) return num[vis]; } d[i] = temp; } if(now == last) return num[now]; } return -1; } int main() { int T,n,m; scanf("%d",&T); pri(); while(T--){ scanf("%d%d",&n,&m); if(bfs(n,m)== -1) printf("Impossible\n"); else printf("%d\n",bfs(n,m)); } return 0; }
原文:http://www.cnblogs.com/zero-begin/p/4357476.html