`
阿尔萨斯
  • 浏览: 4217557 次
社区版块
存档分类
最新评论

国际象棋“皇后”问题的回溯算法

 
阅读更多
<iframe align="center" marginwidth="0" marginheight="0" src="http://www.zealware.com/csdnblog.html" frameborder="0" width="728" scrolling="no" height="90"></iframe>
//国际象棋“皇后”问题处理头文件
//国际象棋“皇后”问题的回溯算法
/**//*
作者:成晓旭
时间:2001年10月9日(17:35:38-18:00:00)
内容:完成“皇后”问题的程序序言部分
时间:2001年10月9日(14:00:00-15:00:00)
内容:完成“皇后”问题的程序序言部分
===================================================
问题描述:
在一个n*n的棋盘上放置n个不能互相捕捉的国际象棋“皇后”,
并输出所有合理的布局情况.(在国际象棋中,皇后可以沿着纵、横
及两条斜线共4个方向捕捉对手,可见,合适的解是在每行、每列及
在一条斜线上只能有一个皇后)
编程思想:
算法描述:
{
输入棋盘大小值n;
m=0;//从空配置开始
notcatch=1;//空配置中皇后不能相互捕捉
do
{
if(notcatch)
{
if(m==n)
{
输出解;
调整(形成下一个候选解);
}
else
扩展当前候选解至下一列;//向前试探
}
else
调整(形成下一个候选解);//向后回溯
notcatch=检查当前候选解的合理性
}while(m!=0)
}
*/

#include
"stdlib.h"
#defineMAXN100
//全局变量及全局工作数组定义
intm,n,NotCatch;
intColFlag[MAXN+1];/**//*表示第i列的第ColFlag[i]行有皇后,(1:有;0:没有)*/
intRowFlag[MAXN+1];/**//*RowFlag[i]:表示第i行没有皇后(1:没有;0:有)*/
intupBiasFlag[2*MAXN+1];/**//*upBiasFlag[i]:表示第i条上斜线(右高左斜)没有皇后(1:没有;0:有)*/
intdnBiasFlag[2*MAXN+1];/**//*dnBiasFlag[i]:表示第i条下斜线(左高右斜)没有皇后(1:没有;0:有)*/
//显示输入填写的数字
voidArrangeQueen()
...{
inti;
charanswer;
printf(
"输入棋盘边格数:");
scanf(
"%d",&n);
for(i=0;in;i++)/**//*设置程序初始状态*/
ColFlag[i]
=1;
for(i=0;i2*n;i++)
upBiasFlag[i]
=dnBiasFlag[i]=1;
m
=1;
ColFlag[
1]=1;
NotCatch
=1;
ColFlag[
0]=0;
do
...{
if(NotCatch)
...{
if(m==n)
...{
printf(
"列 行");
for(i=1;in;i++)/**//*找到可行解,输出*/
printf(
"%3d %3d ",i,ColFlag[i]);
printf(
"还要继续搜索吗(Q/qforExit)? ");
scanf(
"%c",&answer);
if(answer=='Q'||answer=='q')
exit(
0);
while(ColFlag[m]==n)
...{
m
--;/**//*清除第m-1列,第RowFlag[ColFlag[m-1]]行有皇后的标志*/
RowFlag[ColFlag[m]]
=upBiasFlag[m+ColFlag[m]]=dnBiasFlag[n+m-ColFlag[m]]=1;
}

ColFlag[m]
++;/**//*调整第m列的皇后配置(扩展调整)*/
}

else
...{
/**//*设置第m列,第RowFlag[ColFlag[m-1]]行有皇后的标志*/
RowFlag[ColFlag[m]]
=upBiasFlag[m+ColFlag[m]]=dnBiasFlag[n+m-ColFlag[m]]=0;
ColFlag[
++m]=1;/**//*向前试探*/
}

}

else
...{
while(ColFlag[m]==n)/**//*向后回溯*/
...{
m
--;/**//*清除第m-1列,第RowFlag[ColFlag[m-1]]行有皇后的标志*/
RowFlag[ColFlag[m]]
=upBiasFlag[m+ColFlag[m]]=dnBiasFlag[n+m-ColFlag[m]]=1;
}

ColFlag[m]
++;/**//*调整第m列的皇后配置(回溯调整)*/
}

NotCatch
=RowFlag[ColFlag[m]]&&upBiasFlag[m+ColFlag[m]]&&dnBiasFlag[n+m-ColFlag[m]];
}
while(m!=0);
}


voiddArrange_Queen_All(intk,intn)
...{
inti,j;
charanswer;
for(i=1;in;i++)
...{
if(RowFlag[i]&&upBiasFlag[k+i]&&dnBiasFlag[n+k-i])
...{
ColFlag[k]
=i;
RowFlag[i]
=upBiasFlag[k+i]=dnBiasFlag[n+k-i]=0;
if(k==0)
...{
printf(
"列 行");
for(j=1;jn;j++)/**//*找到可行解,输出*/
printf(
"%3d %3d ",i,ColFlag[i]);
printf(
"还要继续搜索吗(Q/qforExit)? ");
scanf(
"%c",&answer);
if(answer=='Q'||answer=='q')
exit(
0);
}

else
dArrange_Queen_All(k
+1,n);
RowFlag[i]
=upBiasFlag[k+i]=dnBiasFlag[n+k-i]=1;
}

}

}

voiddArrangeQueenAll()
...{
inti;
printf(
"输入棋盘边格数:");
scanf(
"%d",&n);
for(i=0;in;i++)/**//*设置程序初始状态*/
ColFlag[i]
=1;
for(i=0;i2*n;i++)
upBiasFlag[i]
=dnBiasFlag[i]=1;
dArrange_Queen_All(
1,n);
}



分享到:
评论

相关推荐

    回溯算法求解 八皇后问题

    八皇后问题是一个古老而著名的问题,是回溯算法的典型例题。该问题是十九世纪著名的数学家高斯1850年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线...

    C++八皇后问题代码,递归实现

    八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或...

    八皇后_1848_回溯算法;_数据结构_八皇后问题_

    回溯算法,递归算法。八皇后一般指八皇后问题。八皇后问题(英文:Eight ...问题表述为:在8×8格的国际象棋上摆放8个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。

    在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击

    八皇后问题,是一个古老而著名的问题,是回溯算法的典型例题。该问题是十九世纪著名的数学家高斯1850年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一...

    N(8)皇后问题

    八皇后问题是一个古老而著名的问题,是回溯算法的典型例题。该问题是十九世纪著名的数学家高斯1850年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线...

    八皇后问题实验报告.pdf

    八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或...

    马的遍历/骑士问题 回溯算法 算法设计作业

    马的遍历,骑士问题,马踏棋盘。回溯算法的经典问题,还有八皇后等。马的遍历也是一个。上算法课正好有这个问题,找了下能用的,vc++6.0调试可用

    非递归回溯算法之n皇后问题

    要在n×n的国际象棋棋盘中放入n个皇后,使任意两个皇后都不能互相吃掉。

    八皇后java算法

    八皇后问题,是一个古老而著名的问题,是回溯算法的典型例题。该问题是十九世纪著名的数学家高斯1850年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一...

    回溯算法典型例题——八皇后

    八皇后问题是一个古老而著名的问题,是回溯算法的典型例题。该问题是十九世纪著名的数学家高斯1850年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线...

    8皇后问题c++代码

    很简单,很好用的代码,用于解决八皇后问题(八皇后问题,是一个古老而著名的问题,是回溯算法的典型例题。该问题是十九世纪著名的数学家高斯1850年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即...

    “八皇后”动态图形的VC实现.rar_vc实现八皇后_八皇后动态_八皇后图形_八皇后问题_国际象棋

    八皇后问题是一个古老而著名的问题,是回溯算法的典型例题。该问题是十九世纪著名的数学家高斯1850年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线...

    用c语言实现八皇后问题

    八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或...

    八皇后问题 C语言

    八皇后问题,是一个古老而著名的问题,是回溯算法的典型例题。该问题是十九世纪著名的数学家高斯1850年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一...

    八皇后问题的解决,92种结果

    八皇后问题是一个古老而著名的问题,是回溯算法的典型例题。该问题是十九世纪著名的数学家高斯1850年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线...

    N皇后问题 C++程序

    八皇后问题是一个古老而著名的问题,它是回溯算法的典型例题。该问题是十九世纪德国著名数学家高斯于1850年提出的:在8行8列的国际象棋棋盘上摆放着 八个皇后。若两个皇后位于同一行、同一列或同一对角线上,则称为...

    经典问题——八皇后解题方法

    八皇后问题是1850年大数学家高斯提出来的,该问题在8*8的国际象棋棋盘上放置8个皇后,条件是做到没有一个皇后能“吃掉”任何其他皇后,即没有任何两个皇后被放置在棋盘的同一行或者同一列,或者同一对角线上。...

    有关8*8国际象棋八皇后问题

    利用数据库相关知识进行算法求精!解决八皇后问题就是利用回溯法和栈来实现的。

    八皇后问题的具体算法 调试过的

    八皇后问题是很经典的问题,八皇后问题是一个古老而著名的问题,是回溯算法的典型例题。该问题是十九世纪著名的数学家高斯1850年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能...

    经典八皇后问题 递归

    八皇后问题是一个古老而著名的问题,是回溯算法的典型例题。该问题是十九世纪著名的数学家高斯1850年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线...

Global site tag (gtag.js) - Google Analytics