【C/C++】回溯经典算法之-->八皇后问题

一、八皇后问题

八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。 高斯认为有76种方案。1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果。

【C/C++】回溯经典算法之-->八皇后问题_第1张图片

二、问题分析

整体思路:

创建一个全局变量的二维数组chess;

并初始化全为0

一行一行开始放皇后;

若存在相互攻击,则皇后向右移一列

若不存在攻击,进行下一行皇后的放置(这里要用到递归)

要点:

(1)国际象棋的格数

国际像是是8*8,因此,如果放置八个皇后,那么每一行都有一个

(2)问题具体化

利用二维数组,用1来代表皇后,其他为0

(3)皇后的放置方法

利用循环,判断位置是否可以放置皇后,若可以,则放置(将其置1)

三、代码实现

代码块:

#include
#include
#define N 8 //可以根据N来修改棋盘的格数 
int count = 0;//设置一个计数器 
int chess[N][N] = {0};//用于存放棋盘的二维数组 

void print()//打印函数 
{	
	int i = 0;
	int j = 0;
	printf("*****************************************\n");
	for(i = 0; i


运行结果:

【C/C++】回溯经典算法之-->八皇后问题_第2张图片

你可能感兴趣的:(八皇后,c语言,递归,回溯算法,C/C++,畅游C语言)