HDU_1016 Prime Ring Problem(素數環|經典回朔|DFS)

HDU_1016 Prime Ring Problem

題意

題意就是經典的素數環….

解決

  1. 經典的回朔問題
  2. 可以寫出一個判斷當前數字是否是素數的函數
  3. DFS的過程是一個不斷試圖對當前位置填方數字的過程
  4. 回朔的時候記得取消vis數組的標記
#include<bits/stdc++.h>
using namespace std;
int n,num[25],vis[25];
int prime[12]={2,3,5,7,11,13,17,19,23,29,31,37};
int judge(int c)
{
    for(int i=0;i<12;i++) if(prime[i]==c) return true;
    return false;
}

void dfs(int cur)
{
    if(cur==n+1 && judge(num[1]+num[n])){               //n個數字填完了(正在填第n+1個)
        for(int i=1; i<=n; i++) printf("%d%c",num[i],i==n?'\n':' ');
        return ;
    }
    for(int i=2;i <= n;i++){
        if(!vis[i] && judge(i+num[cur-1])){             //試圖填寫數字
            num[cur] = i;
            vis[i] = 1;                                 //標記
            dfs(cur+1);                                 //繼續試探
            vis[i] = 0;                                 //回朔
        }
    }
}
int main()
{
    int cases=1;
    while(~scanf("%d",&n))
    {
        printf("Case %d:\n",cases++);
        num[1]=1;
        vis[1]=1;
        dfs(2);
        puts("");
    }
}
發佈了54 篇原創文章 · 獲贊 8 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章