标签:
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 14323 | Accepted: 8080 |
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
题意:将数a变出数b.每次都变换一位数使变换后的数为素数,看最少需要变换几次
#include<iostream> #include<cstdio> #include<cstring> #include<queue> #include<algorithm> #include<cmath> using namespace std; queue<int>Q; int vis[10000]; int used[10000]; int step[10000]; int Build() //素数筛 { int n=10000; memset(vis,0,sizeof(vis)); int m=sqrt(n+0.5); for(int i=2; i<=m; i++) if(!vis[i]) for(int j=i*i; j<=n; j+=i) vis[j]=1; } int p; int BFS(int a,int b) { while(!Q.empty()) //清空 Q.pop(); Q.push(a); used[a]=1; step[a]=0; while(!Q.empty()) { p=Q.front(); Q.pop(); for(int i=0; i<4; i++) { if(i==0) //个位 { for(int j=0; j<=9; j++) { int x=p/10*10+j; if(vis[x]) continue; if(used[x]==0) { used[x]=1; step[x]=step[p]+1; Q.push(x); } if(x==b) return step[x]; } } if(i==1) //十位 { for(int j=0; j<=9; j++) { int y=p%10; int x=p/100*100+j*10+y; if(vis[x]) continue; if(used[x]==0) { used[x]=1; step[x]=step[p]+1; Q.push(x); } if(x==b) return step[x]; } } if(i==2) //百位 { for(int j=0; j<=9; j++) { int y=p%100; int x=p/1000*1000+j*100+y; if(vis[x]) continue; if(used[x]==0) { used[x]=1; step[x]=step[p]+1; Q.push(x); } if(x==b) return step[x]; } } if(i==3) //千位<span id="transmark"></span> { for(int j=1; j<=9; j++) //必须从1开始 { int y=p%1000; int x=j*1000+y; if(vis[x]) continue; if(used[x]==0) { used[x]=1; step[x]=step[p]+1; Q.push(x); } if(x==b) return step[x]; } } } } } int main() { Build(); int a,b,n; while(~scanf("%d",&n)) { while(n--) { memset(used,0,sizeof(used)); scanf("%d%d",&a,&b); printf("%d\n", BFS(a,b)); } } }
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:
原文地址:http://blog.csdn.net/became_a_wolf/article/details/48006589