素数环
题目描述
输入正整数n,把整数1,2,...,n组成一个环,使得相邻两个整数之和均为素数。输出时,从整数1开始逆时针排列。同一个环恰好输出一次。
输入
输入存在多组测试数据,每组测试数据输入一个正整数n(n<=16)
输出
输出的时候第i组测试数据输出Case i:
然后输出若干行,每一行n个数字表示素数环,由于每个环只输出一次,也就是第一个数字永远是1
按照第二位从小到大,第二位相同第三位从小到大,以此类推输出所有方案
相邻两组测试数据之间输出一个空行
然后输出若干行,每一行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; }

浙公网安备 33010602011771号