九度oj-素數環
阿新 • • 發佈:2019-01-31
題目:
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
解題思路:
dfs和回溯的又一好例子,注意return的用法。
# include<stdio.h> # define N 17 int prime[]={2,3,5,7,11,13,17,19,23,29,31,37};//這題重點並不在於求解素數本身 int n; bool hash[N]; int ans[N]; bool check(int x) { for(int i=0;i<12;i++) { if(x==prime[i]) return true; } return false; } void final_put() { if(check(ans[n]+ans[1])==false)//不往下執行了 return; else { for(int i=1;i<=n;i++) { if(i==1) printf("%d",ans[i]); else printf(" %d",ans[i]); } printf("\n"); } } void dfs(int num) { if(num>=2) { if(check(ans[num]+ans[num-1])==false)//回退上一級 return; } if(num==n)//設成全域性變數 { final_put(); return;//回退上一級 } for(int i=2;i<=n;i++)//遍歷 { if(hash[i]==false) { hash[i]=true; ans[num+1]=i; dfs(num+1);//呼叫 hash[i]=false;//全部呼叫完成後,返回時賦值。 } } } int main() { int i; int mycase=0; while(scanf("%d",&n)!=EOF) { mycase++; printf("Case %d:\n",mycase); //初始化 for(i=1;i<N;i++) { hash[i]=false; ans[i]=-1; } hash[1]=true; ans[1]=1; dfs(1); printf("\n"); } return 0; }