八皇后问题

 目录

问题分析

过程模拟

问题回答

八皇后问题非递归实现

八皇后问题递归方式


问题分析

 八皇后问题:高斯于1850年提出的问题。

       在8*8的棋盘上放置八个皇后,任意两个皇后都不能处于同一行、列或者同一斜线上。

    分析:

              首先要解决的两个问题:

                 1. 如何表示棋盘?

                 2. 如何获取皇后的位置信息,进而判断是否相互攻击?

    解决思想:

        解题思想就是问题回溯法。

过程模拟

八皇后问题_第1张图片 

当某个皇后探测到最后一列,而其后还有皇后没有摆放完全的时候,就需要回溯;

将本次探测皇后的上一个皇后向后再探测一个位置,继续下面的皇后的从0开始到最大列的探测;

如果回溯的过程中,直到第一个皇后到最大列位置,还不满足条件,也就是下次的回溯是-1(不存在)的时候,表示皇后的位置探测完毕;

如果在这个探测的过程中,没有输出满足条件的皇后位置序列,表示当前的棋盘和皇后序列不存在。

问题回答

Q1:

表示皇后,可以采用两种方式。

第一种是使用二维数组,用值来标识当前皇后在本位置存在。 如:int chess[N][N];

第二种是使用一位数组,用下标表示皇后的编号,用存放的值表示该皇后在棋盘中列的位置。如 int chess[N];

Q2:

假设皇后i和皇后j在棋盘上的位置是(i, Xi),(j, Xj);

不在同行:i≠j

不在同列:Xi≠Xj

不在同一条斜线上:|i-j|≠|Xi-Xj|  (也即是斜率的绝对值不等于1)

八皇后问题非递归实现

#include
#include
using namespace std;

const int N = 100;//假定最多能求的皇后问题
int x[N] = {-1};//这种方式下标表示皇后,值表示存放的列位置 


//判断第k个皇后放置是否发生冲突 
bool Success(int k){
	//这里判断和前面的皇后是否发生冲突,所以前面皇后的下标是0-(k-1) 
	for(int i=0;i=0){//前面分析过,回溯到-1的时候,表示探测完毕 
		x[k]++;   //下一列摆放皇后k   , 初始k=-1,故而开始探测的起始位置列是0 
		//方式皇后后,就需要判断是否发生冲突
		while(x[k]

 ---------------------------------------------------分割线-------------------------------------------------

结果截图:

八皇后问题_第2张图片

八皇后问题递归方式

#include
#include
using namespace std;

const int N = 100;//假定最多能求的皇后问题
int chess[N][N]={0};
int n = 4;
bool Success(int k, int w){
	for(int i=0;i

 -------------------------------------------------------分割线-------------------------------------------------

结果截图:

八皇后问题_第3张图片

 

作者:无涯明月

发文时间:2018-11-17

你可能感兴趣的:(数据结构,数据结构习题刷题)