首页 > 代码库 > hdu1016Prime Ring Problem
hdu1016Prime Ring Problem
就是说,给你一个数n,
要你把1到n都连在一起成环,
每个数不可重复,
且相连的两个数的和要是素数。
把所有情况输出来,
我是用dfs暴力出来的,
首先把素数打表,
然后每次顺时针预测下一个数,
因为这个数必须要是素数减去上一个数,
很好枚举。
我的代码如下:
#include<iostream> #include<cstring> #include<cstdlib> using namespace std; int map[30],num,prime[]={2,3,5,7,11,13,17,19,23,29,31,37,41},used[30],save[10000][30],cnt; void init() { cnt=0; memset(used,0,sizeof(used)); used[1]=1; map[1]=1; } int cmp(const void *a,const void *b) { return *(int *)a - *(int *)b; } bool isprime(int x) { int *p; p=(int *)bsearch(&x,prime,13,sizeof(int),cmp); if(p!=NULL) return 1; return 0; } void dfs(int i) { if(i==num) { if(isprime(map[num]+1)) { memcpy(save[cnt],map,sizeof(save[cnt])); cnt++; } return; } for(int j=0;j<13;j++) { int tmp=prime[j]-map[i]; if(tmp>num) break; if(tmp>1&&!used[tmp]) { map[i+1]=tmp; used[tmp]=1; dfs(i+1); used[tmp]=0; } } } int main() { int exp=0; while(scanf("%d",&num)!=EOF) { printf("Case %d:\n",++exp); init(); dfs(1); for(int i=0;i<cnt;i++) { printf("%d",save[i][1]); for(int j=2;j<=num;j++) printf(" %d",save[i][j]); printf("\n"); } printf("\n"); } }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。