//============================================================================
//题目:八皇后问题
// 在8*8的国际象棋上摆放8个皇后,其实不能相互攻击,
// 即任意两个皇后不得处在同一行、同一列或者同一条对角线
//思路:递归回溯
// 定义一个二维数组chessboard作为棋盘,下标i,j分别代表棋盘的行列,数组中存储0,1,如果该位置有皇后则为1, 否则为0;
// 依次考虑每一行,判断改行所能放的位置(judege()函数),找到一个合适的位置,即递归考虑下一行,当8行都考虑完毕,即找到一个符合条件的排列
//
//============================================================================
#include<iostream>
//using namespace std;
int chessboard[8][8];
int sum = 0;
int judge(int row, int col) //判断在chessboard[row][col]放数是否符合条件
{
//由于是依次按行放的,所以不需再判断是否同行
for (int i = 0;i < 8;++i) //判断第col列是否已存在元素
{
if(chessboard[i][col])
return 0;
}
for (int i = row, j = col;i>=0&&j >=0;--i,--j)//判断正对角线上是否已存在元素
{
if (chessboard[i][j])
return 0;
}
for (int i = row, j = col;i >= 0 && j < 8;--i,++j)//判断副对角线上是否已存在元素
{
if (chessboard[i][j])
return 0;
}
return 1;
}
void Permutation( int row)
{
if (row == 8)
{
++sum;
return;
}
for (int i = 0;i < 8;++i)
{
if (judge(row, i))
{
chessboard[row][i] = 1; //设置排放标记,
Permutation(row + 1); //递归,考虑下一行摆放的位置
chessboard[row][i] = 0; //清除摆放标记,进行下一种摆放情况的考虑
}
}
}
int main()
{
Permutation(0);
std::cout << sum << std::endl; //输出符合条件的摆法
system("pause");
return 0;
}
八皇后问题——递归回溯
原文作者:八皇后问题
原文地址: https://blog.csdn.net/wangxiao7474/article/details/79824440
本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
原文地址: https://blog.csdn.net/wangxiao7474/article/details/79824440
本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。