您的位置:首页 > 其它

八皇后问题 递归解法

2016-02-26 19:08 661 查看
本文简单讲解了八皇后递归解法, 比较易懂

直接看代码:

#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种解法):

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  八皇后 递归 易懂