素数路
题目描述
已知一个四位的素数,要求每次修改其中的一位,并且要保证修改的结果还是一个素数,还不能出现前导零。你要找到一个修改数最少的方案,得到我们所需要的素数。
例如把1033变到8179,这里是一个最短的方案:
1033
1733
3733
3739
3779
8779
8179
修改了6次。
输入
1行,两个四位的素数(没有前导零),表示初始数和目标数。
输出
一个数,表示最少的操作次数。如果不可能,输出“Impossible”。
样例输入
1033 8179
样例输出
6
bfs搜一下
#include <iostream> #include <string> #include <algorithm> #include <cstring> #include <queue> #include <cstdio> using namespace std; typedef pair<int, int>P; int a[3000], n = 0, x, y; int ok(int n, int m){ int cnt = 0; while(n > 0){ if(n%10 == m%10) cnt++; n /= 10; m /= 10; } return cnt; } void init(){ for(int i = 1000; i <= 10000; i++){ int flag = 1; for(int j = 2; j*j <= i; j++){ if(i % j == 0){ flag = 0; break; } } if(flag){ a[n++] = i; } } } int bfs(){ int vis[10003]; memset(vis, 0, sizeof(vis)); queue<P>s; s.push(P(x, 0)); vis[x] = 1; while(!s.empty()){ P p = s.front(); s.pop(); if(y == p.first){ return p.second; } for(int i = 0; i < n; i++){ if(vis[a[i]] == 0 && ok(p.first, a[i]) == 3){ // printf("%d ", a[i]); vis[a[i]] = 1; s.push(P(a[i], p.second+1)); } } } return -1; } int main() { init(); cin >> x >> y; int ans = bfs(); if(ans == -1){ printf("Impossible "); }else printf("%d ", ans); return 0; }