八皇后变异编程(在线等待)

azhen 2003-10-18 07:33:45

【问题描述】

设计一个程序,使其将由1到N(N为偶数,且N <= 20)的N个正整数分别放置在由N个节点组成的环的各个节点上,其中1必须放在第一个节点上,并使任意两个相邻的节点上的数字之和为质数。

下图是当N为6时的一个例。当N为6时的输出样例如下:

1 4 3 2 5 6

1 6 5 2 3 4




【输入形式】

程序从标准输入上读入一个偶数。



【输出形式】

在标准输出上打印所有符合要求的排列方法。

输出有若干行,每一行都是符合题意的一种排列方法,所有数字从1所在位置开始,按顺时针方向依次输出,各个数字之间以空格分隔。

各行上的排列方式不重复。



注意:输出各行遵循“小数优先”原则, 在各种排列方式中,较小的数尽量靠前输出。如果将每行上的输出看成一个数字,则所有输出构成升序数列。具体格式见输出样例。



【样例输入】

8



【样例输出】

1 2 3 4 7 6 5 8

1 2 3 8 5 6 7 4

1 2 5 6 7 4 3 8

1 2 5 8 3 4 7 6

1 4 7 6 5 2 3 8

1 4 7 6 5 8 3 2

1 6 7 4 3 2 5 8

1 6 7 4 3 8 5 2



【样例说明】

输入整数8,要求将1、2、……、8排成环且相邻两数之和为素数。

合法的排列方法共有8种,由运行结果可见,第2位上可能的数字只有2、4和6。且先输出2开头的所有合法排列,再输出4开头的所有合法排列,最后输出6开头的所有合法排列,余下部分同样遵循此原则。



【运行时限】

要求每次运行时间限制在20秒之内。超出该时间则认为程序错误。


...全文
234 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
buaaaladdin 2003-11-01
  • 打赏
  • 举报
回复
呵呵,楼主竟然是我室友。回头招呼他来结贴。

上面的程序太强了,pf,我用堆栈写出了一个,用了近200行,汗颜阿!学习!
zhouqingyuan 2003-10-31
  • 打赏
  • 举报
回复


#include <stdio.h>
int n;
int nLoop[21];
int beUsed[21];
int isPrime[40]={0,0,2,3,0,5,0,7,0,0,0,11,
0,13,0,0,0,17,0,19,0,0,
0,23,0,0,0,0,0,29,0,31,0,
0,0,0,0,37,0,0};

int testprime(int p)
{
return isPrime[p];
}

void search(int step)
{
int i;
if(step==n)
{
if(testprime(nLoop[0]+nLoop[n-1]))
{
for(i=0;i<n-1;i++)
printf("%d ",nLoop[i]);
printf("%d",nLoop[n-1]);
printf("\n");
}
return;
}
for(i=1;i<=n;i++)
{
if(!beUsed[i] && (testprime(i+nLoop[step-1]))){
beUsed[i]=1;
nLoop[step]=i;
search(step+1);
beUsed[i]=0;
}
}
}

int main()
{
int i=1;
while(scanf("%d",&n)!=EOF){
printf("Case %d:\n",i);
i++;

if(n%2==0)
{
beUsed[1]=1;
nLoop[0]=1;
search(1);
}

printf("\n");
}
return 0;
}
baizhongri 2003-10-31
  • 打赏
  • 举报
回复
用C语言 还是C++写.?
zcnaonao 2003-10-31
  • 打赏
  • 举报
回复
晕死,我刚在研究完八皇后问题,研究的我头都大,来上网轻松一下,没想到又看了了,哭
kbsoft 2003-10-18
  • 打赏
  • 举报
回复
我在基础类里回复了
yang8099601 2003-10-18
  • 打赏
  • 举报
回复
我是菜鸟
我不会

15,440

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 非技术区
社区管理员
  • 非技术区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧