HDU_1016 Prime Ring Problem
題意
題意就是經典的素數環….
解決
- 經典的回朔問題
- 可以寫出一個判斷當前數字是否是素數的函數
- DFS的過程是一個不斷試圖對當前位置填方數字的過程
- 回朔的時候記得取消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("");
}
}