标签:
去年选拔省赛时候的题目,给了两个素数,问每次修改一位上的数字,修改几次能达到目标数字。最近老是没有
刷题的欲望。浑浑噩噩,这道简单的题目差点就放弃了,确实是搜索中比较简单的题目。每次只改变其中的一位,队
列维护,记录一下距离就可以了。。。下午还有比赛,尽量做吧,无所谓啦。
代码:
#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<cmath> #include<vector> #include<set> #include<string> #include<algorithm> #include<queue> #define MAX 0x7fffffff using namespace std; int primer[10005]; int t[5]; int bfs(int n,int m) { int vis[10000]; int dis[10000]; memset(dis,0,sizeof(dis)); memset(vis,0,sizeof(vis)); queue<int>que; que.push(n); int temp,tmp,i,j; dis[n] = 0; vis[n] = 1; while(!que.empty()) { int y = que.front(); que.pop(); if(y == m) return dis[y]; t[1] = y/1000%10; t[2] = y/100%10; t[3] = y/10%10; t[4] = y%10; //cout << t[1] << t[2] << t[3] << t[4] << endl; //cout << dis[y] << endl; //system("pause"); for(i=1; i<=4; i++) { temp = t[i]; for(j=0; j<10; j++) { if(j != t[i]) { t[i] = j; tmp = t[1]*1000 + t[2]*100 + t[3]*10 + t[4]; if(tmp >= 1000 && !vis[tmp] && !primer[tmp]) { dis[tmp] = dis[y] + 1; vis[tmp] = 1; que.push(tmp); } } } t[i] = temp; } } return -1; } int main() { int T,i,j,n,m; cin >>T; int en = sqrt(10000); memset(primer,0,sizeof(primer)); for(i=2; i<=en; i++) { if(!primer[i]) for(j=i+i; j<=10000; j+=i) primer[j] = 1; } while(T --) { cin >> n >> m; int ans = bfs(n,m); if(ans == -1) cout << "Impossible" << endl; else cout << ans << endl; } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:
原文地址:http://blog.csdn.net/sinat_22659021/article/details/48027865