HDU1016 Prime Ring Problem dfs+回溯
點擊打開鏈接
Prime Ring Problem
Time Limit: 4000/2000 MS (Java/Others)????Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 62693????Accepted Submission(s): 26947
?
Problem Description
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
Source
Asia 1996, Shanghai (Mainland China)
Recommend
JGShining???|???We have carefully selected several similar problems for you:??1312?1072?1242?1253?1181
?
題意:
輸入一個數n,把1到n的自然數放到一個環里,相鄰兩個數之和為素數,第一個數必須是1
思路:
素數打表+dfs回溯
因為第一個數是1,所以從2開始搜索
如果這個數沒用過,并且這個數和上一個放到環里的數之和是素數,則把這個數字放入環中
#include<bits/stdc++.h> #include<iostream> using namespace std; int a[20],vis[20],isprime[45]={0},n; void get_prime() {int i,j;for(i=2;i<8;i++)if(!isprime[i])for(j=i*i;j<45;j+=i)isprime[j]=1; }//把40以內的素數打出來.0代表是素數 int dfs(int step) {int i;if(step==n+1&&!isprime[a[n]+a[1]])//深搜到結束條件{for(i=1;i<n;i++)printf("%d ",a[i]);printf("%d\n",a[n]);return 0;}for(i=2;i<=n;i++){if(!vis[i]&&!isprime[i+a[step-1]])//如果這個數沒用過,并且這個數和上一個放到環里的數之和是素數{a[step]=i;vis[i]=1;dfs(step+1);vis[i]=0;//回溯}} } int main() {int k=1;a[1]=1;get_prime();while(scanf("%d",&n)!=EOF){memset(vis,0,sizeof(vis));printf("Case %d:\n",k++);dfs(2);printf("\n");} }?
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的HDU1016 Prime Ring Problem dfs+回溯的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HDU1045 Fire Net 递归回
- 下一篇: HDU1584 蜘蛛牌 DFS回溯