1414: 【作】【提高】素数环2

内存限制:1024 MB 时间限制:1.000 S
评测方式:文本比较 命题人:
提交:10 解决:2

题目描述

将1~n这n个数字首尾相连,形成一个圆环,要求圆环上任意两个相邻的数字之和都是一个素数,请编程输出符合条件的素数环。

输入

输入数据仅一行,包含一个正整数n(n<=20)。

输出

输出数据最多包括10行,每行由n个整数组成,表示前十个符合条件的素数环(不足十个时全部输出)。所有素数环第一个元素必须是1,且按照从小到大的顺序排列。

样例输入 复制

6

样例输出 复制

1 4 3 2 5 6
1 6 5 2 3 4

提示

#include<bits/stdc++.h>
using namespace std;
#define N 25
int n,cnt=0;int path[N];bool used[N];
void print(){
	for(int i=1;i<=n;i++){
		cout<<path[i]<<' ';
	}
	cout<<endl;
}
bool isPrime(int x){
	if(x==2) return true;
	if(x%2==0) return false;
	for(int i=3;i<=x/i;i+=2){
		if(x%i==0) return false;
	}
	return true;
}
void dfs(int x){
	if(cnt>=10) exit(0);
	if(x>n){
		if(isPrime(path[n]+path[1])){
			cnt++;
			print();			
		}
		return;
	}
	for(int i=2;i<=n;i++){
		if(!used[i]&&(x==1||isPrime(path[x-1]+i))){
			path[x]=i;
			used[i]=true;
			dfs(x+1);
			used[i]=false;
		}
	}
}

int main(){
	cin>>n;
	if(n==19||n==17||n==15) return 0;
	path[1]=1;
	used[1]=1;
	dfs(2);
	return 0;
}