# 八皇后递归求解

bool isConfilctQueen(int **martix, int row, int column, int count) {
bool result = false;
for (int i = 0; i < count; i++) { //行检测
if (i == column) continue;
if (martix[row][i] == 1)
return true;
}
for (int i = 0; i < count; i++) { //列检测
if (i == row) continue;
if (martix[i][column] == 1)
return true;
}
for (int i = 1; i < count; i++) { //对角线检测，以目标点为中心,对角线相对长度一次检测四个角
if (row - i >= 0 && column - i >= 0) { //左上角
if (martix[row - i][column - i] == 1)
return true;
}
if (row - i >= 0 && column + i < count) { //右上角
if (martix[row - i][column + i] == 1)
return true;
}
if (row + i < count && column - i >= 0) { //左下角
if (martix[row + i][column - i] == 1)
return true;
}
if (row + i < count && column + i < count) { //右下角
if (martix[row + i][column + i] == 1)
return true;
}
}

return result;
}
void backtrackingQueen(int **martix, int n, int count, int *num) {
if (n == count) {
*num += 1;
printf("第%d组解：\n", *num);
for (int i = 0; i < count; i++) {
for (int j = 0; j < count; j++)
printf("[%d]", martix[i][j]);
printf("\n");
}
printf("\n");
return;
}
for (int i = 0; i < count; i++) { //此循环里2个memset的位置有玄妙
//        memset(martix[n], 0, sizeof(int) * count);
martix[n][i] = 1;
if (!isConfilctQueen(martix, n, i, count))
backtrackingQueen(martix, n + 1, count, num);
memset(martix[n], 0, sizeof(int) * count);
}
}
int nQuenn(int count) {
if (count < 4) {
printf("Error! n < 4\n");
return 0;
}
int **martixQuenn = (int **)malloc(sizeof(int *) * count);
for (int i = 0; i < count; i++) {
martixQuenn[i] = (int *)malloc(sizeof(int) * count);
memset(martixQuenn[i], 0, sizeof(int) * count);
}

int n = 0;
int num = 0;
backtrackingQueen(martixQuenn, n, count, &num);

for (int i = 0; i < count; i++)
free(martixQuenn[i]);
free(martixQuenn);

return num;
}

void printNQueens(int **matrix, int n, int row, int column, int *count) {
if (row >= n || column >= n)
return;

bool flag = true;
for (int i = 0; i < n && flag; i++) {

for (int j = 0; j < n && flag; j++) {
if (matrix[i][j] == 1) {
if (row == i || abs(row - i) == abs(column - j)) {
flag = false;
}
}
}

}

if (flag) {
matrix[row][column] = 1;

if (column == n - 1) { //最后一列到达，开始打印
*count += 1;
printf("第%d组解：\n", *count);
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
printf("%d ", matrix[i][j]);
}
printf("\n");
}
printf("\n");

matrix[row][column] = 0;

return;
}
}

if (flag) {
printNQueens(matrix, n, 0, column + 1, count);
matrix[row][column] = 0;
}

printNQueens(matrix, n, row + 1, column, count);
}
bool nQueens(int n) {
bool result = true;

int **martrix = (int **)calloc(n, sizeof(int *));
for (int i = 0; i < n; i++) {
martrix[i] = (int *)calloc(n, sizeof(int));
for (int j = 0; j < n; j++)
martrix[i][j] = 0;
}

int *count = (int *)calloc(1, sizeof(int));
int row = 0, column = 0;

printNQueens(martrix, n, row, column, count);
printf("all nQueens are %d.\n\n", *count);

for (int i = 0; i < n; i++) {
free(martrix[i]);
martrix[i] = NULL;
}
free(martrix);
martrix = NULL;

free(count);
count = NULL;

return result;
}

• 本文已收录于以下专栏：

## 八皇后问题 递归求解

• dliyuedong
• 2013年10月04日 16:23
• 5034

## 数据结构学习笔记(12.递归的应用之八皇后回溯算法)

• qq418674358
• 2014年04月16日 23:17
• 4401

## 八皇后问题递归解法

• u012842664
• 2015年08月02日 18:25
• 3480

## 八皇后问题（最简单的递归解法）

• yangting09032214
• 2015年08月27日 15:24
• 1714

## 理解使用递归及堆栈的算法处理八皇后问题

• lnnnd
• 2016年05月26日 15:39
• 4133

## 八皇后问题（典型的递归回溯）

• lp15203883326
• 2016年09月07日 20:27
• 994

## 八皇后求解方法（递归求解）

• q623702748
• 2016年04月10日 01:11
• 554

## C#递归求解八皇后

很久没更新Blog了,开始玩玩算法吧,用递归写了一下八皇后,不知道是不是最优方案,继续研究其他的解法,尝试下回朔,代码如下    using System;using System.Colle...
• Red_angelX
• 2007年02月26日 15:51
• 1431

## 八皇后递归求解问题

• sinkary
• 2011年11月24日 12:02
• 765

## 递归算法学习系列之八皇后问题

1.引子    中国有一句古话，叫做“不撞南墙不回头"，生动的说明了一个人的固执，有点贬义，但是在软件编程中，这种思路确是一种解决问题最简单的算法，它通过一种类似于蛮干的思路，一步一步地往前走，...
• GarfieldEr007
• 2015年09月29日 21:33
• 2233

举报原因： 您举报文章：八皇后递归求解 色情 政治 抄袭 广告 招聘 骂人 其他 (最多只允许输入30个字)