| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1723 人关注过本帖
标题:八皇后问题的思路和程序,请各位看看有没什么不合理的地方
只看楼主 加入收藏
克里斯蒂
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2007-6-4
收藏
 问题点数:0 回复次数:1 
八皇后问题的思路和程序,请各位看看有没什么不合理的地方

解题思路:
一个合适的解应是在每列、每行上只有一个皇后,且一条斜线上也只有一个皇后。
求解过程从空配置开始。在第1列至第m列为合理配置的基础上,再配置第m+1列,直至第n列配置也是合理时,就找到了一个解。接着改变第n列配置,希望获得下一个解。另外,在任一列上,可能有n种配置。开始时配置在第1行,以后改变时,顺次选择第2行、第3行、…、直到第n行。当第n行配置也找不到一个合理的配置时,就要回溯,去改变前一列的配置。
引入一个一维数组(col[ ]),值col[i]表示在棋盘第i列、col[i]行有一个皇后。例如:col[3]=4,就表示在棋盘的第3列、第4行上有一个皇后。另外,为了使程序在找完了全部解后回溯到最初位置,设定col[0]的初值为0当回溯到第0列时,说明程序已求得全部解,结束程序运行。
为使程序在检查皇后配置的合理性方面简易方便,引入以下三个工作数组:
(1)数组a[ ],a[k]表示第k行上还没有皇后;
(2)数组b[ ],b[k]表示第k列右高左低斜线上没有皇后;
(3)数组 c[ ],c[k]表示第k列左高右低斜线上没有皇后;
棋盘中同一右高左低斜线上的方格,他们的行号与列号之和相同;同一左高右低斜线上的方格,他们的行号与列号之差均相同。
数据结构与算法:
不需要特殊的数据结构;
使用数组实现回溯法的思想;
初始时,所有行和斜线上均没有皇后,从第1列的第1行配置第一个皇后开始,在第m列col[m]行放置了一个合理的皇后后,准备考察第m+1列时,在数组a[ ]、b[ ]和c[ ]中为第m列,col[m]行的位置设定有皇后标志;当从第m列回溯到第m-1列,并准备调整第m-1列的皇后配置时,清除在数组a[ ]、b[ ]和c[ ]中设置的关于第m-1列,col[m-1]行有皇后的标志。一个皇后在m列,col[m]行方格内配置是合理的,由数组a[ ]、b[ ]和c[ ]对应位置的值都为1来确定。

核心代码及解释:
void queen(int N){
//初始化N+1个元素是为了编程直观,第一个元素不使用
int *col = new int[N + 1];//col[m] = n表示第m列,第n行放置皇后
int *a = new int[N + 1]; // a[k] = 1 表示第k行上没有皇后
int *b = new int[2 * N + 1]; // b[k] = 1 表示第k条主对角线上没有皇后。
int *c = new int[2 * N + 1];// c[k] = 1 表示第k条次对角线上没有皇后。

int j;
for (j=0;j<=N;j++)
a[j]=1;
for (j=0;j<=2*N;j++)
b[j]=c[j]=1;

int m = 1; //从第一列开始 (0不用)
col[1] = 1; //初始第一列,第一行放上皇后
int good = 1;
col[0] = 0;
char awn;

do {
if (good)
if (m==N){ //已经找到一个解
printf("列\t\t行\n");
for (j=1;j<=N;j++)
printf("%d\t\t%d\n",j,col[j]);

printf("Enter a character(Q/q for exit)!\n");
scanf("%c",&awn);
if (awn=='Q'||awn=='q')
exit(0);

while (col[m]==N){//如果本列试探完毕,则回溯
m--; //回溯
//标记 m列col[m]行处没有皇后(所以所在行所在对角线所在次对角线上都没有皇后)
a[col[m]]=b[m+col[m]]=c[N+m-col[m]]=1;
}
col[m]++; //继续试探本列其他行
}
else { //当前列放置的皇后满足要求,但还没找到解,继续考察下一列
a[col[m]]=b[m+col[m]]=c[N+m-col[m]]=0;//当前位置已经放了皇后,标记之
col[++m]=1; //转到下一列第一行
}
else //不满足要求
{
while (col[m]==N) //已经到了列底,所以回溯到上一列
{
m--; //回溯到上一列
a[col[m]]=b[m+col[m]]=c[N+m-col[m]]=1; //标记没有皇后
}
col[m]++; //试探其他行
}
good=a[col[m]]&&b[m+col[m]]&&c[N+m-col[m]]; //检查是否满足要求
} while (m!=0);
}

搜索更多相关主题的帖子: 皇后 思路 合理 col 
2007-06-04 16:16
克里斯蒂
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2007-6-4
收藏
得分:0 
我的这个程序有没有问题啊,着急中....
2007-06-04 18:15
快速回复:八皇后问题的思路和程序,请各位看看有没什么不合理的地方
数据加载中...
 
   



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

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