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. 

 

Input

n (0 < n < 20). 

Output

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. 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<vector>
#include<cstring>
using namespace std;
int n,a[25],vis[25];
int prim(int x)//判斷x爲素數 
{
	for(int i=2;i*i<=x;i++)
	if(x%i==0) return 0;
	return 1;
}
 void dfs(int r){
 	if(r==n&&prim(a[n-1]+a[0])){
 		printf("%d",a[0]);
 		for(int i=1;i<n;i++)
 		printf(" %d",a[i]);
 		printf("\n");
	 }
	 if(r==n) return ;
	 for(int i=2;i<=n;i++){//i代表數i 
	 	if(!vis[i]&&prim(a[r-1]+i)){
	 		a[r]=i;
	 		vis[i]=1;
	 		dfs(r+1); 
	 		vis[i]=0;//一定要將標記撤回 
		 }
	 } 
 }
int main()
{
	int s=1;
	while(~scanf("%d",&n)){
		memset(vis,0,sizeof(vis));
		vis[1]=1;
		a[0]=1;
		printf("Case %d:\n",s++);
		dfs(1);
		printf("\n");
	}
	return 0;
  }  

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章