八皇后问题 递归解法

本文简单讲解了八皇后递归解法, 比较易懂
直接看代码:

#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种解法):
《八皇后问题 递归解法》

    原文作者:八皇后问题
    原文地址: https://blog.csdn.net/John_Lan_2008/article/details/50752015
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞