您的位置:首页 > 其它

ZCMU-1162-松哥的素数

2017-02-03 10:52 183 查看

1162: 松哥的素数

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 128  Solved: 23

[Submit][Status][Web
Board]

Description

松哥回家后居然玩起了填数游戏,该游戏的规则是由整数1,2,3,…,n-1,n,组成的一个环,要求相邻的两个数之和必须为素数.你能告诉松哥所有存在的环嘛?

Input

多组测试数据。每组测试数据包含一个正整数n(n<=20).

Output

对于每组测试数据输出所有的环,环从1开始输出,如果存在多个环,则按照字典序排序,若环不存在,则输出-1.

Sample Input

6

Sample Output

1 4 3 2 5 6
1 6 5 2 3 4
【解析】
这道题如果我们用生成全排列来判断,肯定是会超时的..所以我们用回溯算法,这里要注意的是首尾也要判断,还有就是n为1的时候要输出-1,具体看代码解析。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int isprime(int n)
{
int i;
for(i=2;i*i<=n;i++)//素数判断
{
if(n%i==0)
return 0;
}
return 1;
}
int a[110],vis[110],b[110],n,flag;
void facs(int cur)
{
int i;
if(cur==n&&b[a[0]+a[n-1]])//满足条件了就输出
{
flag=1;
for(i=0;i<n;i++)
{
if(i==0)
printf("%d",a[i]);
else
printf(" %d",a[i]);
}
printf("\n");
return;
}
else
{
for(i=2;i<=n;i++)
{
if(vis[i]==0&&b[i+a[cur-1]]==1)//vis来标记这个数有没有使用过
{
a[cur]=i;
vis[i]=1;//标记这个数限制已经使用过了
facs(cur+1);//递归下去
vis[i]=0;//清除标记
}
}
}
}
int main()
{
int i;
for(i=2;i<=110;i++)
{
b[i]=isprime(i);//判断是否是素数
}
while(~scanf("%d",&n))
{
4000

flag=0;
if(n==1)
{
printf("-1\n");
continue;
}
memset(vis,0,sizeof(vis));
a[0]=1;
facs(1);
if(flag==0)
printf("-1\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: