| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 6525 人关注过本帖
标题:八皇后问题
只看楼主 加入收藏
独孤客
Rank: 1
等 级:新手上路
帖 子:48
专家分:0
注 册:2006-5-1
收藏
 问题点数:0 回复次数:9 
八皇后问题

八皇后:皇后可以在横、竖、斜线上不限步数地吃掉其他棋子。如何将8个皇后放在棋盘上(有8*8个方格),使它们谁也不能被吃掉!这就是著名的八皇后问题。
这个程序我看不懂.哪位朋友能我注释一下.谢谢!
#include "stdio.h"

int count;

int queen [10], column[20],left[20],right[20];

void prt1()

{ int j;

printf("No.%d ",++count);

for (j=1;j<=8;j++) printf("%3d",queen[j]);

printf("\n");

}

void try(int i)

{int j;

for (j=1;j<=8;j++)

if (column[j] && left[i-j+8] && right[i+j])

{ queen[i]=j; column[j]=0;

left[i-j+8]=0; right[i+j]=0;

if (i<8) try(i+1);

else prt1();

column[j]=left[i-j+8]=right[i+j]=1;

}

}

main()

{int i;

for (i=1;i<=16;i++)

column[i]=left[i]=right[i]=1;

count=0; try(1);

}


搜索更多相关主题的帖子: 皇后 
2006-05-01 10:24
soft_wind
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:1430
专家分:0
注 册:2006-4-5
收藏
得分:0 
以下是引用独孤客在2006-5-1 10:24:00的发言:

八皇后:皇后可以在横、竖、斜线上不限步数地吃掉其他棋子。如何将8个皇后放在棋盘上(有8*8个方格),使它们谁也不能被吃掉!这就是著名的八皇后问题。
这个程序我看不懂.哪位朋友能我注释一下.谢谢!
#include "stdio.h"

int count;

int queen [10], column[20],left[20],right[20];

/*
  函数功能:打印出八皇后的结果
*/
void prt1()

{ int j;

printf("No.%d ",++count);

for (j=1;j<=8;j++) printf("%3d",queen[j]);

printf("\n");

}
/*
 函数功能:筛选出符合条件的八皇后的位置
 函数入口:第几行
*/

void try(int i)

{int j;

for (j=1;j<=8;j++)

if (column[j] && left[i-j+8] && right[i+j])  /*如果第i行所对应的列上为1且沿y=x方向线上的为1且沿y=-x方向线上的值为1,则说明这个[i][j]这个坐标是合适的,可以放皇后*/

{ queen[i]=j; column[j]=0;   /*放上皇后后,对应的列置0,表示这列的位置不能再放皇后*/

left[i-j+8]=0; right[i+j]=0;    /*同理,沿y=x方向线和沿y=-x方向线都不能再放皇后*/

if (i<8) try(i+1);   /*如果还没执行到第八行,递归继续执行*/

else prt1();     /*如果已经执行到第八行,则可以打印出八皇后的位置结果*/

column[j]=left[i-j+8]=right[i+j]=1;  /*还原初始状态,以便使for(j=1;j<=8;j++)这个循环继续有效执行*/

}

}

main()

{int i;

for (i=1;i<=16;i++)

column[i]=left[i]=right[i]=1;  /*设置初始状态*/

count=0; try(1);   /*记数置0,进入函数计算*/

}


呵呵,上个月编过八皇后,起先我是用循环算的,计算机算了N久还是没算出结果,后来,跟这个程序差不多,用了递归.


对不礼貌的女生收钱......
2006-05-01 11:42
sunnvya
Rank: 5Rank: 5
等 级:贵宾
威 望:17
帖 子:1094
专家分:0
注 册:2005-11-23
收藏
得分:0 
数据结构地方有的是
去看看!

http://www. 第二站>>>提供源码下载
2006-05-01 11:42
–★–
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:1512
专家分:0
注 册:2006-5-1
收藏
得分:0 
回复:(独孤客)八皇后问题
//对楼主的程序作了些化简,但愿有助于您读懂
#include<stdio.h>
Que(int i)
{ int j;
static char queens[]="012345678";
static char column[]="00000000000000000";
static char left[ ]="00000000000000000";
static char right[ ]="00000000000000000";
for(j=1;j<=8;j++)
if(column[j]-'1'&&left[i-j+8]-'1'&&right[i+j]-'1')
{ column[j]='1'; left[i-j+8]='1'; right[i+j]='1';
queens[i]='0'+j;
if(i<8)Que(i+1);
else printf("%-10s",queens+1);
column[j]=left[i-j+8]=right[i+j]='0';
}
}
main(){Que(1);printf("\n");}

落霞与孤鹜齐飞,秋水共长天一色! 心有多大,路有多宽。三教九流,鸡鸣狗盗。兼收并蓄,海纳百川。
2006-05-01 20:44
271391233
Rank: 1
等 级:新手上路
帖 子:174
专家分:0
注 册:2005-2-24
收藏
得分:0 
if (column[j] && left[i-j+8] && right[i+j])  /*如果第i行所对应的列上为1且沿y=x方向线上的为1且沿y=-x方向线上的值为1,则说明这个[i][j]这个坐标是合适的,可以放皇后*/

{ queen[i]=j; column[j]=0;   /*放上皇后后,对应的列置0,表示这列的位置不能再放皇后*/

left[i-j+8]=0; right[i+j]=0;    /*同理,沿y=x方向线和沿y=-x方向线都不能再放皇后*/

if (i<8) try(i+1);   /*如果还没执行到第八行,递归继续执行*/

else prt1();     /*如果已经执行到第八行,则可以打印出八皇后的位置结果*/

column[j]=left[i-j+8]=right[i+j]=1;  /*还原初始状态,以便使for(j=1;j<=8;j++)这个循环继续有效执行*/

}


坚持就是胜利>>静心,静思
2006-05-01 20:54
独孤客
Rank: 1
等 级:新手上路
帖 子:48
专家分:0
注 册:2006-5-1
收藏
得分:0 
好象我懂了.谢谢哦!

乘天地之正,御六气之辩,以游于无穷,是为逍遥!!!
2006-05-08 10:49
xinfresh
Rank: 4
等 级:贵宾
威 望:13
帖 子:594
专家分:0
注 册:2006-1-13
收藏
得分:0 

我不会C
这个是我用VB写的,你有兴趣可以看看:
http://www.bc-cn.net/bbs/dispbbs.asp?BoardID=6&ID=47113&replyID=&skin=1


E-mail:xinfresh@QQ:383094053校内:http:///getuser.do?id=234719042
2006-05-08 20:19
lyzhm
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2006-5-20
收藏
得分:0 
为什么y=x对角线为left[i-j+8]
y=-x对角线为 right[i+j])???
2006-05-20 17:19
soft_wind
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:1430
专家分:0
注 册:2006-4-5
收藏
得分:0 
以下是引用lyzhm在2006-5-20 17:19:00的发言:
为什么y=x对角线为left[i-j+8]
y=-x对角线为 right[i+j])???

他只是定义个数组来实现,i-j有可能是负数,故让它后移8项。
至于y=x,与y=-x这就是算法问题了。您自己看注释,了解了楼主的算法就知道了。


对不礼貌的女生收钱......
2006-05-20 17:24
LSYHEFENG
Rank: 2
等 级:论坛游民
帖 子:112
专家分:71
注 册:2010-7-17
收藏
得分:0 
这样递归太超时了,有没有更高效的啊
2010-08-04 16:52
快速回复:八皇后问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.074735 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved