码迷,mamicode.com
首页 > 其他好文 > 详细

素数路

时间:2016-07-30 10:26:22      阅读:176      评论:0      收藏:0      [点我收藏+]

标签:

素数路

题目描述

已知一个四位的素数,要求每次修改其中的一位,并且要保证修改的结果还是一个素数,还不能出现前导零。你要找到一个修改数最少的方案,得到我们所需要的素数。
例如把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\n", 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\n");
    }else printf("%d\n", ans);

    return 0;
}
我好菜啊

 

 

素数路

标签:

原文地址:http://www.cnblogs.com/cshg/p/5720235.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!