zoukankan      html  css  js  c++  java
  • 素数路(prime)

    素数路(prime)

    题目描述

    已知一个四位的素数,要求每次修改其中的一位,并且要保证修改的结果还是一个素数,还不能出现前导零。你要找到一个修改数最少的方案,得到我们所需要的素数。
    例如把1033变到8179,这里是一个最短的方案:
    1033
    1733
    3733
    3739
    3779
    8779
    8179
    修改了6次。

    输入

    1行,两个四位的素数(没有前导零),表示初始数和目标数。

    输出

    一个数,表示最少的操作次数。如果不可能,输出“Impossible”。

    样例输入

    1033 8179
    

    样例输出

    6
    分析:bfs,预处理四位素数;
    代码:
    #include <iostream>
    #include <cstdio>
    #include <cstdlib>
    #include <cmath>
    #include <algorithm>
    #include <climits>
    #include <cstring>
    #include <string>
    #include <set>
    #include <map>
    #include <queue>
    #include <stack>
    #include <vector>
    #include <list>
    #include <ext/rope>
    #define rep(i,m,n) for(i=m;i<=n;i++)
    #define rsp(it,s) for(set<int>::iterator it=s.begin();it!=s.end();it++)
    #define vi vector<int>
    #define pii pair<int,int>
    #define mod 1000000007
    #define inf 0x3f3f3f3f
    #define pb push_back
    #define mp make_pair
    #define fi first
    #define se second
    #define ll long long
    #define pi acos(-1.0)
    const int maxn=1e5+10;
    const int dis[4][2]={{0,1},{-1,0},{0,-1},{1,0}};
    using namespace std;
    using namespace __gnu_cxx;
    ll gcd(ll p,ll q){return q==0?p:gcd(q,p%q);}
    ll qpow(ll p,ll q){ll f=1;while(q){if(q&1)f=f*p;p=p*p;q>>=1;}return f;}
    int n,m,all,a[maxn],vis[maxn];
    bool sushu(int p)
    {
        if(p<=1)return false;
        else if(p==2)return true;
        else if(p%2==0)return false;
        for(int i=3;i*i<=p;i+=2)if(p%i==0)return false;
        return true;
    }
    void dfs()
    {
        queue<int>p;p.push(n);vis[n]=1;
        while(!p.empty())
        {
            int u=p.front(),v;
            p.pop();
            if(u==m)return;
            for(int i=0;i<=9;i++)
            {
                v=u-u%10+i;
                if(!vis[v]&&a[v])p.push(v),vis[v]=vis[u]+1;
            }
            for(int i=0;i<=9;i++)
            {
                v=u-u/10%10*10+i*10;
                if(!vis[v]&&a[v])p.push(v),vis[v]=vis[u]+1;
            }
            for(int i=0;i<=9;i++)
            {
                v=u-u/100%10*100+i*100;
                if(!vis[v]&&a[v])p.push(v),vis[v]=vis[u]+1;
            }
            for(int i=0;i<=9;i++)
            {
                v=u-u/1000*1000+i*1000;
                if(!vis[v]&&a[v])p.push(v),vis[v]=vis[u]+1;
            }
        }
    }
    int main()
    {
        int i,j,k,t;
        scanf("%d%d",&n,&m);
        for(int i=1000;i<=9999;i++)
            if(sushu(i))a[i]=1;
        dfs();
        if(vis[m])printf("%d
    ",vis[m]-1);
        else puts("Impossible");
        //system ("pause");
        return 0;
    }
    
    
    
     
     
  • 相关阅读:
    ASP.NET 页面访问控制
    数据库设计——范式
    C#接口
    员工签到签退
    sharepoint content type publishing
    安卓自动化测试环境搭建
    SharePoint 2016 Document Center Send To Connection
    ADO.NET DBHelper 类库
    SQL语句总结
    移动端屏幕适配问题
  • 原文地址:https://www.cnblogs.com/dyzll/p/5720246.html
Copyright © 2011-2022 走看看