Try Again

Prime Ring Problem

A ring is compose of n circles as shown in diagram. Put natural number 1, 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.


Inputn (0 < n < 20).
OutputThe 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. Print solutions in lexicographical order.

You are to write a program that completes above process.

Print a blank line after each case.
Sample Input

6
8

Sample Output

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<cstring>
#include<cmath>
using namespace std;
int a[22],b[22],mark[22];
int prime(int x)//判断是否是素数
{
  int o=sqrt(x);
  if(x==1 || x==4) return 1;
  if(x==2 || x==3) return 0;
  for(int i=2;i<=o;i++)
  {
    if(x%i==0) return 1;
  }
  return 0;
}
void print(int n,int b[])//输出
{
  for(int i=1;i<=n;i++)
  {
    if(i!=1) cout<<' ';
    cout<<b[i];
  }
  cout<<endl;
}
int judge(int front,int last,int k,int n)//递归判断素数环
{
  if(prime(front+last)) return 0;
  b[k]=last;
  if(k==n && !prime(last+1))
  {
    print(n,b);
    return 1;
  }
  mark[last]=0;//标记是该数在子函数内不能在出现,但是回归主函数时必须释放
  for(int i=2;i<=n;i++)
  {
    if(mark[i] && judge(last,i,k+1,n)) break;
  }
  mark[last]=1;
  return 0;
}
int main()
{
  int count=1,n;
  while(cin>>n)
  {
    for(int i=1;i<=n;i++)
    {
      mark[i]=1;
    }
    b[1]=1;
    cout<<"Case "<<count++<<":"<<endl;
    if(n==1) cout<<n<<endl;//1单独输出
    else {
      for(int i=2;i<=n;i++)
    {
      judge(1,i,2,n);
    }
    cout<<endl;
  }
}
  return 0;
}
#include <iostream>
#include <algorithm>
#include<cmath>
using namespace std;
int a[30],vis[30];
int prime(int x)
{
  int o=sqrt(x);
  if(x==1 || x==4) return 1;
  if(x==2 || x==3) return 0;
  for(int i=2;i<=o;i++)
  {
    if(x%i==0) return 1;
  }
  return 0;
}
void dfs(int n,int m){

    if(n>m && prime(a[1]+a[m])==0){
        for(int i=1;i<=m;i++){
            if(i!=1) cout<<' ';
            cout<<a[i];
        }
        cout<<endl;
    }
    for(int i=2;i<=m;i++){
        if(vis[i]==0){
            a[n]=i;
            if(n==1 || (prime(i+a[n-1])==0)){
                    vis[i]=1;
                    dfs(n+1,m);
                    vis[i]=0;
            }
        }
    }
}
int main(){
    int n,count=1;
    while(cin>>n){
      cout<<"Case "<<count++<<":"<<endl;
    a[1]=1;
    vis[1]=1;
    dfs(2,n);
    cout<<endl;
  }
  return 0;
}

 

 

 
posted @ 2017-03-19 10:52  十年换你一句好久不见  阅读(139)  评论(0编辑  收藏  举报