Problem : 1016 ( Prime Ring Problem ) Judge Status : Accepted
RunId : 4376328 Language : G++ Author : nasta
题意:
输入正整数n,把整数1~n组成换,是相邻两数之和均为素数。输出时从1开始逆时针排列。1<n<20
分析:
此题如果用枚举肯定超时,故可用DFS+剪枝+回溯。
网上看别人写得代码有用奇偶剪枝的,我自己试了下,对AC时间无影响、、、
#include <cstdio>
#include <cmath>
#define MAX 20
int isp[MAX*2];
int A[MAX], vis[MAX];
int n;
bool state = false;
bool isPrime(int n)
{
if(n <= 1)
return false;
int t = (int)sqrt((float)n);
for(int i=2; i <= t; ++i)
if(n % i == 0)
return false;
return true;
}
void dfs(int cur)
{
if(cur == n && isp[A[0]+A[n-1]])
{
state = true;
for(int i=0; i < n; ++i)
{
if(i != 0)
printf(" ");
printf("%d", A[i]);
}
printf("\n");
}
else
for(int i=2; i<=n; ++i)
{
if(!vis[i] && isp[i+A[cur-1]])
{
A[cur] = i;
vis[i] = 1;
dfs(cur+1);
vis[i] = 0;
}
}
}
int main()
{
for(int i=2; i < MAX*2; ++i)
isp[i] = isPrime(i);
int i=1;
A[0]=1;
while(scanf("%d", &n) != EOF)
{
state = false;
printf("Case %d:\n", i++);
dfs(1);
if(!state)
printf("\n");
printf("\n");
}
return 0;
}
算法源自白书《算法竞赛:入门经典》
本文针对1016(Prime Ring Problem)问题,介绍了如何利用深度优先搜索(DFS)结合剪枝和回溯的方法求解,使得1到n的整数形成环,相邻数之和为素数。

被折叠的 条评论
为什么被折叠?



