您的位置:首页 > 其它

hdu1016 Prime Ring Problem

2015-08-16 13:14 357 查看
dfs,用全局数组和变量保存并更新当前状态。

答案可以直接在搜索结束时打印,n为奇数时方案数为0。

acm.hdu.edu.cn/showproblem.php?pid=1016

#include <cstdio>
#include <cstring>

using namespace std;

const int maxn = 20;
int n;
int ans[maxn], k;
bool isprime[50];
bool vis[20];

void init(){
memset(isprime, 0, sizeof isprime);
isprime[2] = isprime[3] = 1;
for(int i = 5; i <= 50; i += 2){
bool ok = 1;
for(int j = 3; j * j <= i; j += 2){
if(i % j == 0){
ok = 0;
break;
}
}
isprime[i] = ok;
}
memset(vis, 0, sizeof vis);
}

void dfs(int u){
//finished num is u
if(u == n && isprime[1 + ans[n - 1]]){
printf("%d", ans[0]);
for(int i = 1; i < k; i++) printf(" %d", ans[i]);
printf("\n");
}
for(int i = 1; i <= n; i++){
if(!vis[i] && isprime[i + ans[u - 1]]){
vis[i] = 1;
ans[k++] = i;
dfs(u + 1);
vis[i] = 0;
--k;
}
}
}

void solve(){
init();
k = 0;
ans[k++] = 1;
vis[1] = 1;
dfs(1);
}

int main(){
int kase = 0;
while(~scanf("%d", &n)){
printf("Case %d:\n", ++kase);
solve();
printf("\n");
}
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: