您的位置:首页 > 其它

HDU-1016-Prime Ring Problem

2016-04-01 12:17 453 查看

HDU-1016-Prime Ring Problem

题目链接:HDU-1016

题目大意:输入正整数n,把整数1,2,3,…,n组成一个环,使得相邻两个整数之和为素数。输出时从整数1开始。

题目思路:DFS,注意判断最后一个和第一个数相加也是素数

以下是代码:

#include <vector>
#include <map>
#include <set>
#include <algorithm>
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <string>
#include <cstring>
using namespace std;
int prm[100000];
const int MAXV = 1e5;
bool isPrime[MAXV+1];
int size=0;
int A[30];
int vis[30];
//获得素数
void getPrime()
{
memset(isPrime, true, sizeof(isPrime));
int sq = sqrt((double)MAXV) + 1;
int i,j,k;
for(i = 2;i <= sq; i++)
if(isPrime[i])
for(j = 2,k = MAXV/i+1;j < k;j++)
isPrime[i*j] = false;
for( i = 2 ; i <= MAXV; i++)
if(isPrime[i])
prm[size++] = i;
isPrime[0] = isPrime[1] = false;
}
int n;
int cnt = 1;
int first = 1;
void dfs(int cur)
{
if (cur == n + 1 && isPrime[A
+ A[1]])
{
printf("%d",A[1]);
for(int i = 2; i <= n; i++)
{
printf(" %d",A[i]);
}
printf("\n");
return;
}
for (int i = 1; i <= n; i++)
{
if (!vis[i] && isPrime[i + A[cur - 1]])
{
vis[i] = 1;
A[cur] = i;
dfs(cur + 1);
vis[i] = 0;
}
}
}

int main(){
getPrime();
while(scanf("%d",&n) != EOF)
{
printf("Case %d:\n",cnt++);
memset(vis,0,sizeof(vis));
memset(A,0,sizeof(A));
vis[1] = 1;
A[1] = 1;
if (n % 2 != 1) dfs(2);
printf("\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  dfs HDU 1016