nyoj 488 && hdu 1016 素数环
2017-04-18 20:42
387 查看
素数环
时间限制:1000 ms | 内存限制:65535 KB难度:2
描述
有一个整数n,把从1到n的数字无重复的排列成环,且使每相邻两个数(包括首尾)的和都为素数,称为素数环。
为了简便起见,我们规定每个素数环都从1开始。例如,下图就是6的一个素数环。
![](http://acm.nyist.net/JudgeOnline/admin/kind/attached/20120315192417_81102.gif)
输入有多组测试数据,每组输入一个n(0<n<20),n=0表示输入结束。输出每组第一行输出对应的Case序号,从1开始。
如果存在满足题意叙述的素数环,从小到大输出。
否则输出No Answer。样例输入
6 8 3 0
样例输出
Case 1: 1 4 3 2 5 6 1 6 5 2 3 4 Case 2: 1 2 3 8 5 6 7 4 1 2 5 8 3 4 7 6 1 4 7 6 5 8 3 2 1 6 7 4 3 8 5 2 Case 3:No Answer
杭电的不用剪枝判断
#include<stdio.h>
#include<string.h>
int a[21],book[21];
int z[41]={0,1,1,1,0,1,0,1,0,0,0,1,0,1,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0};
int n;
void dfs(int x)
{
int k,j;
if(x==n && z[a[1]+a[x]])
{
// f=1;
for(j=1;j<n;j++)
printf("%d ",a[j]);
printf("%d\n",a
);
return ;
}
else
{
for(k=2;k<=n;k++)
{
if(z[a[x]+k]&& book[k]==0)
{
a[x+1]=k;
book[k]=1;
dfs(x+1);
book[k]=0;
}
}
}
}
int main()
{
int m=0;
while(scanf("%d",&n)&& n)
{
printf("Case %d:\n",++m);
memset(book,0,sizeof(book));
a[1]=1;
// f=0;
if(n%2==0 ||n==1){
dfs(1);
continue;
}
// if(f==0)
printf("No Answer\n");
}
return 0;
}
相关文章推荐
- nyoj 488&&hdu 1016 素数环【dfs】
- HDU Largest prime factor && nyoj 520 最大素因子【素数】
- NYOJ 364 & HDU 1052 田忌赛马(贪心)
- NYOJ 513 & HDU 1753 A+B Problem IV(模拟)
- 深搜入门之素数环 hdu 1016
- nyoj-228(士兵杀敌五)&& hdu-1556 Color the ball
- hdu-1556 Color the ball && nyoj -123 士兵杀敌(四)----------》树状数组
- hdu 3037 Saving Beans 求Comb(n,m)%p p是素数且p<=10000
- Hdu 1998&&Nyoj 734 奇数阶魔方
- poj 3641&hdu 1905(伪素数判定)
- hdu 1016 Prime Ring Problem
- Nyoj 488 素数环
- NYOJ 520 & HDU 2136 Largest prime factor(筛法思想)
- hdu 1050 Moving Tables && nyoj 220 推桌子
- hdu1016 (素数环)(深度优先搜索)另附:http://acm.nyist.net/JudgeOnline/problem.php?pid=488
- nyoj&&hdu 卡片游戏
- NYOJ 503 & HDU 2199 解方程(二分)
- NYOJ-488 素数环
- Fire Net HDU && NYOJ blockhouses
- 素数环(nyoj 488)