1. 程式人生 > >HDU 1016 Prime Ring Problem

HDU 1016 Prime Ring Problem

分類

HDU 素數 DFS

題意

輸入一個數n,把1到n的自然數放到一個環裡,保證相鄰的兩個數的和是素數。

樣例輸入輸出

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

想法

DFS基礎題,注意深搜結束條件

程式碼

249ms

#include<bits/stdc++.h>
using namespace std;
const int maxn =  1111
; int get_prim[maxn]={0}; int circle[maxn],vis[maxn],n; void Get_prim(){//素數打表 1表示不是素數 get_prim[1] = 1; for(int i=2;i<=maxn;i++){ if(!get_prim[i]){ for(int j=i*i;j<=maxn;j+=i){ get_prim[j] = 1; } } } } void dfs(int step){ if(step==n+1&&!get_prim[circle[1]+circle[n]
]){//深搜結束條件 for(int i=1;i<n;i++) printf("%d ",circle[i]); printf("%d\n",circle[n]); }else{ for(int i=2;i<=n;i++){ if(!vis[i]&&!get_prim[circle[step-1]+i]){ circle[step] = i;//把符合要求的數存入陣列 vis[i] = 1;//標記 dfs(step+1); vis[i] = 0;//回溯 } } } } int main() { //freopen("in.txt","r",stdin);
Get_prim(); int kase=0; while(cin >> n&&n){ memset(vis,0,sizeof(vis)); circle[1] = 1; printf("Case %d:\n",++kase); dfs(2); printf("\n"); } return 0; }