八皇后问题——递归回溯

//============================================================================
//题目:八皇后问题
//      在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;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值