八皇后 —— 递归

代码

#include "iostream"
using namespace std;

int number = 0;

int isleague(int row, int j, int(*chess)[8])
{
    int i, k, flag1 = 0, flag2 = 0, flag3 = 0, flag4 = 0, flag5 = 0;
    // 判断竖的方向是否合法(是否有冲突)
    for (i = 0; i < 8; i++)
    {
        if (*(*(chess + i) + j) != 0)
        {
            flag1 = 1;
            break;
        }
    }

    // 判断左上方是否合法
    for (i = row, k = j; i >= 0 && k >= 0; i--, k--)
    {
        if (*(*(chess + i) + k) != 0)
        {
            flag2 = 1;
            break;
        }

    }
    // 判断右下方是否合法
    for (i = row, k = j; i < 8 && k < 8; i++, k++)
    {
        if (*(*(chess + i) + k) != 0)
        {
            flag3 = 1;
            break;
        }
    }
    // 判断右上方是否合法
    for (i = row, k = j; i >= 0 && k < 8; i--, k++)
    {
        if (*(*(chess + i) + k) != 0)
        {
            flag4 = 1;
            break;
        }
    }
    // 判断左下方是否合法
    for (i = row, k = j; i < 8 && k >= 0; i++, k--)
    {
        if (*(*(chess + i) + k) != 0)
        {
            flag5 = 1;
            break;
        }
    }

    if (flag1 || flag2 || flag3 || flag4 || flag5)
    {
        return 0;
    }
    else
    {
        return 1;
    }
}

/* 参数row: 行 参数cols: 列 参数int (*(chess)[8]): 指向棋盘行的指针 */
void Eight_Queens(int row, int cols, int (*chess)[8])
{

    int chess2[8][8]; // 临时棋盘
    int i, j;

    for (i = 0; i < 8; i++)
    {
        for (j = 0; j < 8; j++)
        {
            chess2[i][j] = chess[i][j]; // 棋盘的赋值
        }
    }

    if (8 == row)
    {
        printf("第 %d 种方法:\n", number + 1);
        for (i = 0; i < 8; i++)
        {
            for (j = 0; j < 8; j++)
            {
                printf("%d ", *(*(chess2 + i) + j));
            }
            printf("\n");
        }
        printf("\n");
        number++;
    }
    else
    {
        // 判断这个位置是否合法
        // 如果合法,继续往下
        for (j = 0; j < cols; j++)
        {
            if (isleague(row, j, chess))
            {
                for (i = 0; i < 8; i++)
                {
                    *(*(chess2 + row) + i) = 0;
                }
                *(*(chess2 + row) + j) = 1;
                Eight_Queens(row + 1, cols, chess2);  // 递归
            }
        }
    }


}

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

    system("pause");
}

说明

  1的位置是皇后应该在的位置,共有92种方法,因为控制台缓存的问题,不能打印全部,大家可以通过 debug 的方法逐一查看。

截图

《八皇后 —— 递归》

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