九度OJ 1459 Prime ring problem(递归)

来源:互联网 发布:小霸王网络电视说明书 编辑:程序博客网 时间:2024/06/06 00:59
题目描述:

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.


样例输入:
68
样例输出:
Case 1:1 4 3 2 5 61 6 5 2 3 4Case 2:1 2 3 8 5 6 7 41 2 5 8 3 4 7 61 4 7 6 5 8 3 21 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]);elseprintf(" %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;}


0 0