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("");
}
}