http://www.wlacm.com/problem.php?cid=1237&pid=11
题目描述
素数环:从1到n(1<=n<=12)这n个数摆成一个环,要求相邻的两个数的和是一个素数。
请输出最多前5个答案以及方案总数。
如果无解,输出"no solution!"(引号不输出)
输入
输入n
输出
请输出最多前5个答案(不足5个按实际答案数输出) 以及方案总数。
如果无解,输出"no solution!"(引号不输出)
样例输入
10
样例输出
<1>1 2 3 4 7 6 5 8 9 10 <2>1 2 3 4 7 10 9 8 5 6 <3>1 2 3 4 9 8 5 6 7 10 <4>1 2 3 8 5 6 7 4 9 10 <5>1 2 3 8 5 6 7 10 9 4 960
解题思路
先把2*n范围内的素数全部找出来放到一个数组里方便后面判断前后两个数和是否为素数。
下一步定下第一个数,应为第一个数要是'1',于是从第二个数开始回溯,判断这个数和前一个数和是否为素数就好。
判断到最后一个数,再用第一个数加最后一个数,是素数的话就输出。
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int n,tot=0,a[15],ss[25]={0};
bool t[15];
void fs();
void f(int);
int main(int argc, char *argv[])
{
cin>>n;
if(n==1)
{
printf("no solution!\n");
return 0;
}
fs();
f(1);
if(tot)
printf("%d\n",tot);
else
printf("no solution!\n");
return 0;
}
void fs()
{
for(int i=3;i<2*n;i++)
for(int j=2;j<i;j++)
if(i%j==0)
{
ss[i]=1;
break;
}
}
void f(int x)
{
if(n==x-1&&ss[a[n]+a[1]]==0)
{
tot++;
if(tot<=5)
{
printf("<%d>",tot);
for(int i=1;i<=n;i++)
printf("%d ",a[i]);
printf("\n");
}
}
for(int i=1;i<=n;i++)
{
if(t[i]==false)
{
if(x==1||(x>=2&&ss[i+a[x-1]]==0))
{
a[x]=i;
t[i]=true;
f(x+1);
t[i]=false;
}
}
}
}