文章目錄
- Problem Description
- Input
- Output
- Sample Input
- Sample Output
- Source
Prime Ring Problem Time Limit : 4000/2000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other)Total Submission(s) : 14 Accepted Submission(s) : 10Font: Times New Roman | Verdana | Georgia
Font Size: ← →Problem DescriptionA 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
68
Sample Output
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
SourceAsia 1996, Shanghai (Mainland China)
解題思路:本題為典型一維深度優先搜尋題。我學深搜時模仿的第一個代碼,不知道怎麼碼解說了。。。。。。
#include<cstdio>#include<cstring>using namespace std;int n;int cil[22]; //已使用資料的儲存int num[22]; //資料使用方式0,1int prime[40]={0,0,1,1,0,1,0,1,0,0,0,1,0,1,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,1,0,1,0,0,0,0,0,1,0,0}; // 素數列表,hass表void dfs(int x){ int i,j; if(x==n&&prime[cil[0]+cil[x-1]]) //環已滿,頭尾能串連,符合要求 { printf("1"); for(i=1;i<n;i++) printf(" %d",cil[i]); printf("\n"); } else { for(i=2;i<=n;i++) { if(!num[i]&&prime[cil[x-1]+i]) { cil[x]=i; num[i]=1; dfs(x+1); num[i]=0; } } }}int main(){ int i=1; while(scanf("%d",&n)!=EOF) { memset(num,0,sizeof(num)); cil[0]=1; printf("Case %d:\n",i++); dfs(1); printf("\n"); } return 0;}