八皇后问题程序代码及分析

18 篇文章 0 订阅
 八皇后问题是一个古老而著名的问题,该问题是十九世纪著名的数学家高斯1850年提出的。
在国际象棋中,皇后是最有权利的一个棋子;只要别的棋子在它的同一行或同一列或同一斜线(正斜线或反斜线)上时,它就能把对方棋子吃掉。所以高斯提出了一个问题:在8*8的格的国际象棋上摆放八个皇后,使其不能相互攻击,即任意两个皇后都不能处于同一列、同一行、或同一条斜线上面,问共有多少种解法。




程序代码:
#include "stdafx.h"
#include <iostream>
using namespace std;


static char chQueue[8][8];
static int iA[8];
static int iB[15];
static int iC[15];
static int iQueueNum = 0;// 记录总的棋盘状态总数;


void Queue(int i);        // i 表示行数;




int main(int argc,char* argv[])
{
for (int iLine = 0;iLine < 8;++ iLine)
{
iA[iLine] = 0;//  列表示初始化,表示无列冲突;
for (int iColumn = 0;iColumn < 8;++ iColumn)
{
chQueue[iLine][iColumn] = '*';
}
}


// 主从对角项标记初始化,表示无冲突;
for (int iLine = 0;iLine < 15;++ iLine)
{
iB[iLine] = iC[iLine] = 0;
}
Queue(0);
return 0;
}




void Queue(int i)
{
int iColumn = 0;     // 纵队为零,初始化一下;
for(iColumn = 0;iColumn < 8;++ iColumn)
{
// 判断,如果没有冲突的话,就进行下面的操作;
if (iA[iColumn] == 0 && iB[i - iColumn + 7] == 0 && iC[i + iColumn] == 0)
{
chQueue[i][iColumn] = 'Q'; // 放皇后
iA[iColumn] = 1;   // 标记下一次该位置不能在放皇后;
iB[i - iColumn + 7] = 1;// 标记下一次该主对角线上不能在放皇后了;
iC[i + iColumn] = 1;    // 标记下一次该从对角线上不能在放皇后了;
if (i < 7)   // 如果遍历的行数没有完,则进入下一行继续进行遍历;
{
Queue(i+ 1);
}
else // 输出结果棋盘状态;
{
int iLine = 0;
int iColumn = 0;
cout << "第" << ++ iQueueNum << "中状态为\n";
for (iLine = 0;iLine < 8;iLine ++)
{
for (iColumn = 0;iColumn < 8;++ iColumn)
{
cout << chQueue[iLine][iColumn];
}
cout << endl;
}
cout << endl;
cout << endl;
getchar();
}


// 如果前面放置的皇后无论如何都不能导致后面的皇后满足要求时,
// 进行回溯,重置;
chQueue[i][iColumn] = '*';
iA[iColumn] = 0;
iB[i - iColumn + 7] = 0;
iC[i + iColumn] = 0;
}
}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值