NYOJ488~素数环

来源:互联网 发布:手机上开淘宝店怎么开 编辑:程序博客网 时间:2024/06/16 10:37

思路:DFS。因为是一个环1 4 3 2 5 6和4 3 2 5 6 1是一样得所以我们把第一个数设置为1就可以避免重复。dfs得时候传一个还需要选几个数字,如果能选够k个数字,就输出答案。这个数字被选过就标记一下,用完取消标记。

注意有一个剪枝,就是奇数个数字一定不能组成素数环此时直接输出-1。因为如要组成素数环必须要一奇一偶才可以,而奇数个数不能组成这样的环,如1 2 3 4 5,5+1=6是个偶数不是素数。

但是如果只有一个数字1,是可以的。


#include<bits/stdc++.h>using namespace std;const int MAXN = 55;int n,a[MAXN];bool vis[MAXN],prime[MAXN];void dfs(int k){if(k == 0 && prime[a[n] + a[1]] == true){for(int i = n; i >= 2; i--) printf("%d ",a[i]);printf("%d\n",a[1]);return ;}for(int i = 2; i <= n; i++){if(vis[i] == false && prime[i + a[k + 1]] == true){a[k] = i;vis[i] = true;dfs(k - 1);vis[i] = false;}}}int main(){memset(prime,0,sizeof(prime));prime[2 ] = true; prime[3 ] = true; prime[5 ] = true; prime[7 ] = true; prime[11] = true; prime[13] = true;      prime[17] = true; prime[19] = true; prime[23] = true; prime[29] = true; prime[31] = true; prime[37] = true; int CASE = 1;while(~scanf("%d",&n) && n){printf("Case %d:\n",CASE++);if(n == 1){ printf("1\n");continue; }//n==1的时候 if(n % 2 == 1) { printf("No Answer\n");continue; }//奇数个数字组不成素数环 memset(vis,0,sizeof(vis));a[n] = 1; vis[1] = true; //首位一定为1 dfs(n - 1); }return 0;}








原创粉丝点击