八皇后问题程序代码及分析
来源:互联网 发布:寻秦ol下载悠米版java 编辑:程序博客网 时间:2024/05/02 01:41
八皇后问题是一个古老而著名的问题,该问题是十九世纪著名的数学家高斯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;
}
}
}
在国际象棋中,皇后是最有权利的一个棋子;只要别的棋子在它的同一行或同一列或同一斜线(正斜线或反斜线)上时,它就能把对方棋子吃掉。所以高斯提出了一个问题:在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;
}
}
}
- 八皇后问题程序代码及分析
- 八皇后问题解法及算法分析
- 八皇后问题 JAVA程序代码以及运行结果
- 八皇后及n皇后问题
- 八皇后及n皇后问题
- 八皇后及N皇后问题
- 八皇后及n皇后问题
- 回溯法解八皇后问题及再看八皇后问题优化
- SICP 2.42 “八皇后问题”及“n皇后问题”
- 八皇后问题各种解法分析
- 八皇后问题各种解法分析
- 八皇后问题的分析与解法
- 八皇后问题程序及注解
- [转帖]八皇后问题程序及注解
- 八皇后问题 及 非正式个人代码
- 第一次实验--八皇后及N皇后问题
- 第一次实验:八皇后及N皇后问题
- 第一次实验 八皇后及N皇后问题
- hdu 1163 Eddy's digital Roots
- 【原】NTL在VC6.0中的用法简介
- 微软面试题:反转字符串
- Sql Injection 各系列精彩文章推荐!
- 黑马程序员.net学习笔记一 索引小记
- 八皇后问题程序代码及分析
- android最佳学习路线,学习心得
- 使用反射得到泛型的实际参数类型
- 使myeclipse新建jsp的默认编码为UTF-8
- Android布局属性详解
- 好技术文章 收集 陆续编辑中...
- C++初始化与赋值
- VC中基于 Windows 的精确定时
- 正则表达式限制文本框只能输入数字