HDU 1016(Prime Ring Problem)
/*DFS
Date: 2012/10/11
题目链接地址:http://acm.hdu.edu.cn/showproblem.php?pid=1016
思路:从1开始找,在从与1之和为质数的val开始,再从与val为质数的开始,当找到最后一个点时判断一下
它和1是否为质数,若是则输出
*/
#include<iostream> #include<cmath> using namespace std; #define maxn 21 bool visited[maxn]; int arr[maxn]; int n,count = 1; bool isPrime(int x) { for(int i = 2; i*i <= x; i++) if(x % i == 0) return false; return true; } void dfs(int val,int num) //val为当前找的值,num为已找到的数的个数 { int i; visited[val] = true; arr[num] = val; if(num == n) { if(isPrime(val+1)) { printf("%d",arr[1]); for(i = 2; i <= n; i++) printf(" %d",arr[i]); printf("\n"); } } else { for(i = 2; i <= n; i++) if(!visited[i] && isPrime(i+val)) dfs(i,num+1); } visited[val] = false; } int main() { //freopen("1006.txt","r",stdin); while(scanf("%d",&n) != EOF) { memset(visited,false,sizeof(visited)); printf("Case %d:\n",count++); dfs(1,1); printf("\n"); } return 0; }

浙公网安备 33010602011771号