输入正整数n,把整数1,2,…,n组成一个环,使得相邻两个整数之和均为素数。输出时,从整数1开始逆时针排列。同一个环恰好输出一次。n<=16.
A ring is composed of n (even number) circles as shown in diagram. Put natural numbers1,2……n into each circle separately, and the sum of numbers in two adjacent circles should be a prime. Note: the number of first circle should always be 1.
n(0< n<=16)
The output format is shown as sample below. Each row represents a series of circle numbers in the ring beginning from 1 clockwisely and anticlockwisely. The order of numbers must satisfy the above requirements. You are to write a program that completes above process.
6 8
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
n<=16,数据很小,可以暴搜,途中用stack记录经历的点
这道题的难点是输出格式啊QAQ!!!
example:
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//这里也没有空格 //这里有回车//luogu的原题中输出格式是崩坏的啊!!!QAQ
#include<cmath> #include<cstdio> #include<cstring> #include<iostream> using namespace std; int n; bool sf[21]; int stack[21]; int flag; bool prime(int x) { for(int i=2;i<=sqrt(x);++i) if(x%i==0)return 0; return 1; } int tot=0; void print() { if(!prime(1+stack[n]))return; if(!flag){ if(tot)cout<<endl; flag++; printf("Case %d:",++tot); } cout<<endl; cout<<1; for(int i=2;i<=n;++i) cout<<" "<<stack[i]; } void search(int x) { for(int i=2;i<=n;++i) if(!sf[i]&&prime(stack[x-1]+i)) { stack[x]=i; sf[i]=1; if(x==n)print(); else search(x+1); sf[i]=0; } return; } int main() { while(cin>>n) { memset(sf,0,sizeof(sf)); flag=0; stack[1]=1; sf[1]=1; search(2); cout<<endl; } }转载于:https://www.cnblogs.com/qwerta/p/9379747.html
相关资源:JAVA上百实例源码以及开源项目