zoukankan      html  css  js  c++  java
  • 算法设计与分析 5.5 真-白给题

    ★题目描述

    给定1-n的一个排列,要求你将它们重排,使得任意两个相邻的数的和为质数。

    ★输入格式

    一个正整数n。n<=20。

    ★输出格式

    输出一行一个1-n的排列,满足相邻的两个数相加为质数。

    如果有多组解,输出字典序最小的那一个。

    如果无解,输出-1。

    ★样例输入

    2
    

    ★样例输出

    1 2
    

    ★样例输入

    3
    

    ★样例输出

    1 2 3
    

    ★提示

    ★参考代码

    /*
    优化:
    	满足要求的数列必定是一积一偶排列的 
    */
    
    #include<bits/stdc++.h>
    using namespace std;
    int n;
    int res[21];
    
    int isPrime(int num){ 
        if(num==2) return true; //2特殊处理 
        if(num<2 || num%2 == 0) return false; //识别小于2的数和偶数 
    	for(int i=3; i*i<=num; i+=2){
    		if(num%i==0) return false;
    	}
    	return true;
    }
    
    void dfs(int step){
    	if(step==n+1){
    		for(int i=1; i<=n; ++i) printf("%d ",res[i]);
    		exit(0);
    	}
    	for(int i=step; i<=n; i+=2){
    		swap(res[step], res[i]);
    		if(isPrime(res[step]+res[step-1])) dfs(step+1);
    		swap(res[step], res[i]);
    	}
    } 
    
    int main(){
    	scanf("%d",&n);
     
    	for(int i=1; i<=n; ++i){
    		res[i]=i;
    	}
    	
    	for(int i=1; i<=n; i+=2){
    		swap(res[1], res[i]);
    		dfs(2);
    		swap(res[1], res[i]);
    	}
    	printf("-1
    "); 
    	return 0;
    }
    
  • 相关阅读:
    MFC 中 Tooltip 实现的几种方式
    C++11带来的优雅语法
    socket异步编程--libevent的使用
    单元测试与解耦
    Ubuntu(Linux) + mono + jexus +asp.net MVC3
    常见算法总结
    NET里简易实现AOP
    KMP算法
    简易的集群通讯组件
    数据访问层的封装与抽象
  • 原文地址:https://www.cnblogs.com/yejifeng/p/12080880.html
Copyright © 2011-2022 走看看