八皇后算法题

八皇后问题介绍

八皇后问题是一个古老的问题,于1848年由一位国际象棋棋手提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,如何求解?

所谓递归回溯,本质上是一种枚举法。这种方法从棋盘的第一行开始尝试摆放第一个皇后,摆放成功后,递归一层,再遵循规则在棋盘第二行来摆放第二个皇后。如果当前位置无法摆放,则向右移动一格再次尝试,如果摆放成功,则继续递归一层,摆放第三个皇后……

#include <iostream>
#include <stdlib.h>
using namespace std;

const int MAX_NUM = 8;

int chessBoard[MAX_NUM][MAX_NUM];

///——————————>x
//|0 1 2 3 4 5 6 7 8 
//|1
//|2
//|3
//|4
//|5
//|6
//|7
//|8
//|y

//打印棋盘
void printchessBoard()
{
	for (int i = 0;i<MAX_NUM;i++)
	{
		for(int j = 0;j<MAX_NUM;j++)
		{
			cout<<chessBoard[i][j]<<" ";
		}
		cout<<endl;
	}
	cout<<endl;
}

//检查是否符合要求
bool check(int x,int y){
	for (int i =0;i<y;i++)
	{
		//检查纵向
		if(chessBoard[x][i] == 1)
		{
			return false;
		}
		
		//检查左斜线
		if (chessBoard[x-1-i][y-1-i] == 1 && x-1-i >= 0)
		{
			return false;
		}

		//检查右斜线
		if(chessBoard[x+1+i][y-1-i] == 1 && x+1+i < MAX_NUM)
		{
			return false;
		}
	}
	return true;
}


bool settleQueen(int y)
{
	
	//位数超过8,说明找到了答案
	if(y == MAX_NUM)
	{
		return true;

	}

	//遍历当前行,逐一验证
	for (int i=0;i<MAX_NUM;i++)
	{
		//为当前行清零,以免回溯时出现脏数据
		for (int x=0;x<MAX_NUM;x++)
		{
			chessBoard[x][y] = 0;
		}
		//检查是否符合规则,如果符合,更改元素值并进一步递归
		if (check(i,y))
		{
			chessBoard[i][y] = 1;
			//递归如果返回true,说明下层已经找到解决方案,无需继续循环
			if (settleQueen(y+1))
			{
				return true;
			}
		}
	}
	return false;
}



void main()
{
	settleQueen(0);
	printchessBoard();

	system("pause");
}

最后的结果为

《八皇后算法题》

    原文作者:八皇后问题
    原文地址: https://blog.csdn.net/qq_21477999/article/details/79803247
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞