素数环

题目描述

输入正整数n,把整数1,2,...,n组成一个环,使得相邻两个整数之和均为素数。输出时,从整数1开始逆时针排列。同一个环恰好输出一次。

输入

输入存在多组测试数据,每组测试数据输入一个正整数n(n<=16)

输出

输出的时候第i组测试数据输出Case i:
然后输出若干行,每一行n个数字表示素数环,由于每个环只输出一次,也就是第一个数字永远是1
按照第二位从小到大,第二位相同第三位从小到大,以此类推输出所有方案
相邻两组测试数据之间输出一个空行

样例输入 Copy

6
8

样例输出 Copy

Case 1:
1 4 3 2 5 6
1 6 5 2 3 4

Case 2:
1 2 3 8 5 6 7 4
1 2 5 8 3 4 7 6
1 4 7 6 5 8 3 2
1 6 7 4 3 8 5 2

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n;
int a[22];
int st[22];//状态数组
//判断一个数是否为素数
bool check(int c) { for(int i=2;i<c;i++) { if(c%i==0) return false; } return true; } void dfs(int u) { if(u==n&&check(a[0]+a[n-1])) { for(int i=0;i<n;i++) { printf("%d ",a[i]); } printf("\n"); } else { for(int i=2;i<=n;i++) { if(!st[i]&&check(a[u-1]+i)) { st[i]=1; a[u]=i; dfs(u+1); st[i]=0; } } } } int main() { int ans=1; a[0]=1; while(cin>>n) { printf("Case %d:\n",ans); ans++; dfs(1); memset(st,0,sizeof(st)); printf("\n"); } return 0; }

 

posted @ 2021-03-30 21:18  只配吃三碗饭  阅读(228)  评论(0)    收藏  举报