-
题目描述:
-
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.
-
输入:
-
n (1 < n < 17).
-
输出:
-
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. -
-
-
样例输入:
-
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
#include <stdio.h> int prime[] = {2,3,5,7,11,13,17,19,23,29,31,37,41}; bool hash[20]; int ans[20]; int n; bool judge(int x) { for(int i = 0; i < 13; i++) { if(x == prime[i]) return true; } return false; } void check() { if(judge(ans[n]+ans[1]) == false) return; for(int i = 1; i <= n; i++) { if(i == 1) printf("%d",ans[i]); else printf(" %d",ans[i]); } printf("\n"); } void DFS(int number) { if(number > 1) if(judge(ans[number]+ans[number-1]) == false) return; if(number == n) { check(); return; } for(int i = 2; i <= n; i++) { if(hash[i] == true) continue; hash[i] = true; ans[number+1] = i; DFS(number+1); hash[i] = false; } } int main() { int count = 1; while(scanf("%d",&n) != EOF) { for(int i = 0; i < 20; i++) hash[i] = false; ans[1] = 1; hash[1] = true; printf("Case %d:\n",count); DFS(1); printf("\n"); count++; } return 0; }
-