本文简单讲解了八皇后递归解法, 比较易懂
直接看代码:
#include <stdio.h>
#define NUM_QUEUE 8
#define TRUE 1
#define FALSE 0
// 记录解法数
int gCount = 0;
// 使用二维数组定义棋盘
int gChessBoard[NUM_QUEUE][NUM_QUEUE] = { 0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
};
/* * PrintChessBoard * ------------------------------------------- * 打印棋盘局面 */
void PrintChessBoard()
{
int i, j;
printf("\nPrint Chess board ... Start \n");
for (i = 0; i < NUM_QUEUE; ++i)
{
for (j = 0; j < NUM_QUEUE; ++j)
{
printf("%d ", gChessBoard[i][j]);
}
printf("\n");
}
printf("\nPrint Chess board ... End \n");
}
/* * IsPlace * @row 棋盘行号(0 - 7) * @col 棋盘列号(0 - 7) * ------------------------------------------- * 判断(row,col) 位置是否可以落子 */
int IsPlace(int row, int col)
{
// 判断 同一行 是否有棋子
for (int i = 0; i < col; i++)
{
if (gChessBoard[row][i] == 1)
{
return FALSE;
}
}
// 判断 同一列 是否有棋子
for (int i = 0; i < row; i++)
{
if (gChessBoard[i][col] == 1)
{
return FALSE;
}
}
// 判断 左上和右上 对角线 是否有棋子
int i, j;
for (i = row - 1, j = col - 1; (i >= 0) && (j >= 0); i--, j--)
{
if (gChessBoard[i][j] == 1)
{
return FALSE;
}
}
for (i = row - 1, j = col + 1; (i >= 0) && (j < NUM_QUEUE); i--, j++)
{
if (gChessBoard[i][j] == 1)
{
return FALSE;
}
}
return TRUE;
}
/* * PlaceQueue * @row 棋盘行号(0 - 7) * ------------------------------------------- * 递归逐行放置棋子 */
void PlaceQueue(int row)
{
// 如果递归行号到 8 行
// 递归结束
// ** 不能在 PlaceQueue(row + 1); 之前
// ** 判断递归到 7 行结束, 否则
// ** 不能到 7 行不能完全回溯
if (row == NUM_QUEUE)
{
PrintChessBoard();
gCount++;
return ;
}
for (int i = 0; i < NUM_QUEUE; i++)
{
if (IsPlace(row, i))
{
gChessBoard[row][i] = 1; // 放置棋子
PlaceQueue(row + 1); // ** 不能在之前 返回
// ** 否则无法在 7 行回溯
gChessBoard[row][i] = 0; // 回溯,清除此处棋子
}
}
}
/* * EightQueue() * ------------------------------------------- * 八皇后包装函数 */
void EightQueue()
{
PlaceQueue(0);
}
/* * main * ------------------------------------------- * 主函数,最后打印解法数 */
int main(int argc, char** argv)
{
EightQueue();
printf("八皇后的解法数: %d\n", gCount);
getchar();
return 0;
}
运行结果(92种解法):