数据结构预算法之八皇后递归实现

前言

最近在学校数据结构与算法, 说实话第一次接触这些东西, 有些地方学起来还是挺费脑子的! 其实好多都是建立在理解的基础上, 当你理解了就好很多! 然后再自己去实践! 完成那些经典算法的实现步骤! 可以更好地加深理解!
本篇文章相当于在学习是的学习笔记, 供以后复习使用! 当然若能帮助到遇到该问题的朋友, 也是非常荣幸的!
OZ8K, 正所谓光说不练, 净是扯......

问题

八皇后问题,是一个古老而著名的问题,即:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。 高斯认为有76种方案。1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果。计算机发明后,有多种计算机语言可以解决此问题。

算法

本篇文章是用递归算法实现解决八皇后问题, 当然解决该问题也可以用回溯算法! 代码有详细注释!

代码

#include 

/*总共有多少种排列方法*/
int totalCount = 0;


// 检查row行, col列 这个位置是否安全
int isSecurity(int row, int col, int chess[8][8]) {
    
    int j = 0, k = 0;

    int flag = 0;

    for (int i = 0; i < 8; ++i)
    {
        // 检查在列上是否安全
        if (chess[i][col] != 0) {
            flag = 1;
            break;
        };
        
        // 检查左上是否安全
        j = row - i;
        k = col - i;
        if ((j >= 0 && k >= 0)) if (chess[j][k] != 0) {
            flag = 1;
            break;
        };

        // 检查右下是否安全
        j = row + i;
        k = col + i;
        if ((j < 8 && k < 8)) if (chess[j][k] != 0) {
            flag = 1;
            break;
        }

        // 检查左下是否安全
        j = row + i;
        k = col - i;
        if ((j < 8 && k >= 0)) if (chess[j][k] != 0) {
            flag = 1;
            break;
        }
        

        // 检查右上是否安全
        j = row - i;
        k = col + i;
        if ((j >= 0 && k < 8)) if (chess[j][k] != 0) {
            flag = 1;
            break;
        }
    }


    return !flag;
}

/*从第 row 行 开始, 总归 n 列*/
void EightQueen(int row, int n, int chess[8][8])
{

    int chess2[8][8];

    for (int i = 0; i < 8; i++)
    {
        for (int j = 0; j < 8; j++)
        {
            chess2[i][j] = chess[i][j];
        }
    }

    // 先判断结束条件
    if (row == 8)
    {
        printf("第 %d 种排列方法\n", totalCount + 1);

        // 输出排列结构
        for (int i = 0; i < 8; i++)
        {
            for (int j = 0; j < 8; j++)
            {
                printf("%d ", chess[i][j]);
            }
            printf("\n");

        }
        printf("\n\n");
        totalCount ++;

    } else {
        // 不满足结束条件, 则继续排列
        for (int i = 0; i < 8; i++)
        {
            // 先判断要插入的位置是否安全
            if (isSecurity(row, i, chess))
            {
                // 如果安全, 则插入
                for (int i = 0; i < 8; i++)
                {
                    // 先把该行的所有数据赋值为 0
                    chess2[row][i] = 0;
                }
                chess2[row][i] = 1;
                EightQueen(row + 1, n, chess2);
            }
        }
    }
}

int main(int argc, char const *argv[])
{
    int chess[8][8];

    for (int i = 0; i < 8; i++)
    {
        for (int j = 0; j < 8; j++)
        {
            chess[i][j] = 0;
        }
    }

    EightQueen(0, 8, chess);
    
    return 0;
}

你可能感兴趣的:(数据结构预算法之八皇后递归实现)