八皇后问题(回溯法)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
return 0;
八皇后问题(回溯法)2009-08-11 12:03问题描述:
求出在一个n×n的棋盘上,放置n个不能互相捕捉的国际象棋“皇后”的所有布局,这是来源于国际象棋的一个问题。皇后可以沿着纵横和两条斜线4个方向互相捕捉。
解题思路:
总体思想为回溯法。
求解过程从空配置开始。在第1列~的m列为合理配置的基础上,再配置第m+1列,直至第n列也是合理时,就找到了一个解。在每列上,顺次从第一行到第n行配置,当第n行也找不到一个合理的配置时,就要回溯,去改变前一列的配置。
#include <stdlib.h>
void queen(int N)
{ //初始化N+1个元素,第一个元素不使用
int col[N+1]; //col[m]=n表示第m列,第n行放置皇后
int a[N+1]; //a[k]=1表示第k行没有皇后
int b[2*N+1]; //b[k]=1表示第k条主对角线上没有皇后
}
else //当前放置的皇后满足要求,但还没找到解,继续考察下一列
{
a[col[m]]=b[m+col[m]]=c[N+m-col[m]]=0; //标志当前位置已经放置皇后
col[++m]=1; //转到下一列第一行
}
}
else
{
while(col[m]==N) //已经到了列底,所以回溯到上一列
int c[2*N+1]; //c[k]=1表示第k条次对角线上没有皇后
int j,m=1,good=1;char awn;
for(j=0;j<=N;j++)
{a[j]=1;}
for(j=0;j<=2*N;j++)
{b[j]=c[j]=1;}
col[1]=1;col[0]=0;
do
{
if(good)
if(awn=='Q'||awn=='q')
ห้องสมุดไป่ตู้exit(0);
while(col[m]==N) //如果本列试探完毕,则回溯
{
m--; //回溯
a[col[m]]=b[m+col[m]]=c[N+m-col[m]]=1;//标记m列col[m]行处没有皇后(所在行,对角线,次对角线上都没有皇后)
}
col[m]++; //继续试探本列其他行
{
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);
}
int main()
{
queen(8);
{
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);
为使在检查皇后配置的合理性方面简易方便,引入一下4个工作数组:
•数组col[i],表示在棋盘第i列,col[i]行有一个皇后;
•数组a[],a[k]表示第k行上还没有皇后;
•数组b[],b[k]表示第k列右高左低斜线上没有皇后;
•数组c[],c[k]表示第k列左高右低斜线上没有皇后;
代码:
#include <stdio.h>
相关文档
最新文档