hdu1016
来源:互联网 发布:淘宝历史最低价 影响 编辑:程序博客网 时间:2024/05/21 00:17
//深搜,注意最后还要和1相加判断是不是素数;#include <iostream>#include <cstdio>#include <cstring>using namespace std;int mp[100], b[100];int mark[100];int a[100];int n, k, h = 0;void inint(){ memset(a, 0, sizeof(a)); for(int i = 2; i*i <= 100; i++) for(int j = i; j*i < 100; j++) if(!a[j*i]) a[j*i] = 1;}void dfs(int x){ if(k == n-1) { if(a[b[n-2]+1]) return ; printf("1"); for(int i = 0; i < n-1; i++) printf(" %d", b[i]); printf("\n"); return ; } for(int i = 2; i <= n; i++) if(!mark[i] && !a[mp[i]+x]) { b[k++] = mp[i]; mark[i] = 1; dfs(mp[i]); mark[i] = 0; k--;//如果这个数不符合 下一个数还要在这个位置,k不变 } return ;}int main(){ while(cin >> n) { printf("Case %d:\n", ++h); inint(); for(int i = 1; i <= n; i++) mp[i] = i; memset(mark, 0, sizeof(mark)); mark[1] = 1; k = 0; dfs(1); printf("\n"); }}