标签:
| Time Limit: 1000MS | Memory Limit: 65536K | |
| Total Submissions: 12480 | Accepted: 7069 | 
Description
 The ministers of the cabinet were quite upset by the message from the Chief of Security stating that they would all have to change the four-digit room numbers on their offices.
The ministers of the cabinet were quite upset by the message from the Chief of Security stating that they would all have to change the four-digit room numbers on their offices. 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
题意:求从一个四位数素数到另一个四位数素数所需的最短步数,每一步只能改变一位数字,且改变过程中的数必须是四位数
这是一道典型的数位搜索题,求最短路所以用bfs,难点在于模拟数的转化,另外注意边界控制
 
#include<iostream> #include<cstdlib> #include<cstdio> #include<cstring> #include<algorithm> #include<queue> using namespace std; const int maxn=10000; int n,m; bool vis[maxn]; int ans; struct node { int num,step; }; int mypow(int n,int k) { int res=1; while(k--) res*=n; return res; } bool isprime(int n) //判断素数,由于数据不大,懒得打印素数表了 { for(int i=2;i*i<=n;i++){ if(n%i==0) return false; } return true; } int change(int n,int i,int j) //模拟数的转化,有很多技巧方法,一定要细心 { int f=n/mypow(10,i+1)*mypow(10,i+1);//保留前缀 int r=n%mypow(10,i);//保留后缀 int mid=j*mypow(10,i); //改变中间的数 return f+mid+r; } bool bfs() { memset(vis,0,sizeof(vis)); queue<node> q; q.push({n,0}); vis[n]=1; while(!q.empty()){ node now=q.front(); q.pop(); if(now.num==m){ ans=now.step; return true; } for(int i=0;i<4;i++){ //从第1位到第四位 for(int j=0;j<=9;j++){ //把所在位数字改为j int nextnum=change(now.num,i,j); if(nextnum<1000||nextnum>=maxn) continue;//边界控制 if(vis[nextnum]||!isprime(nextnum)) continue; vis[nextnum]=1; q.push({nextnum,now.step+1}); } } } return false; } int main() { int T;cin>>T; while(T--){ cin>>n>>m; if(bfs()) cout<<ans<<endl; else cout<<"Impossible"<<endl; } return 0; }
标签:
原文地址:http://www.cnblogs.com/--560/p/4334727.html