八皇后问题——递归回溯

//============================================================================
//题目:八皇后问题
//      在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
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞