zoukankan      html  css  js  c++  java
  • Prime Path的题解

    给定两个四位素数 n,m。
    每次能改变 n 中的一个数字,每次改变后的 N 也必须是素数。(首位不能改
    成 0)
    求最少经过多少次改变能使 n 变成 m,如果无法变成则输出-1。

    直接搜索

    #include <bits/stdc++.h>
    using namespace std;
    template<typename T>inline void read(T &FF){
    	T RR=1;FF=0;char CH=getchar();
    	for(;!isdigit(CH);CH=getchar())if(CH=='-')RR=-1;
    	for(;isdigit(CH);CH=getchar())FF=(FF<<1)+(FF<<3)+(CH^48);
    	FF*=RR;
    }
    template<typename T>void write(T x){
    	if(x<0)putchar('-'),x*=-1;
    	if(x>9)write(x/10);
    	putchar(x%10+48);
    }
    bool ss(int x){
    	for(int i=2;i*i<=x;i++)
    		if(x%i==0)return false;
    	return true;
    }
    int f[100010];
    queue<int>q;
    queue<int>s;
    int main(){
    	int x,y;
    	read(x);read(y);
    	if(x==y){
    		cout<<0;
    		return 0;
    	}
    	f[x]=1;
    	q.push(x);
    	s.push(0);
    	while(q.size()){
    		int x=q.front();
    		int a[5];
    		a[1]=x/1000%10;
    		a[2]=x/100%10;
    		a[3]=x/10%10;
    		a[4]=x/1%10;
    		for(int i=1;i<=4;i++){
    			for(int j=0;j<=9;j++){
    				int l=a[i];
    				a[i]=j;
    				int z=a[1]*1000+a[2]*100+a[3]*10+a[4]*1;
    				if(!f[z]&&ss(z)&&z>=1000){
    					f[z]=1;
    					q.push(z);
    					s.push(s.front()+1);
    					if(z==y){
    						cout<<s.front()+1;
    						return 0;
    					}
    				}a[i]=l;
    			}
    		}q.pop();
    		s.pop();
    	}cout<<-1<<endl;
    	return 0;
    }
    
  • 相关阅读:
    NSOperation
    iOS 数据持久化方案
    JS高级学习历程-15
    JavaScript进阶
    JavaScript进阶
    JavaScript进阶
    JS高级学习历程-14
    JavaScript进阶
    Linux 添加硬盘并分区
    VxWorks实验八 信号
  • 原文地址:https://www.cnblogs.com/zhaohaikun/p/12816972.html
Copyright © 2011-2022 走看看