18、栈案例6:八皇后问题(递归实现)

题源及算法思路来源于“网易云课堂:数据结构实战完全手册(夏曹俊·丁宋涛)”

八皇后问题(递归实现)的需求

  八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。

八皇后问题(递归实现)的简单实现

最终结果显示,八皇后问题共有92种解题方法

int c[20];// 辅助数组,存放可以放的皇后的列
int RowSum = 8;// 总行数,也可代表总列数
int count = 0;// 八皇后问题的解法数量

// 找到一个解就输出结果
void PrintResult()
{
    for(int i = 0; i < RowSum; i++)
    {
        for(int j = 0; j < RowSum; j++)
        {
            if(j == c[i])
            {
                printf("1 ");
            }
            else
            {
                printf("0 ");
            }
        }
        printf("\n");
    }
    printf("\n");
}

// 搜索第RowColumn行(列)的函数
void EightQueen(int RowColumn)
{
    // 当前解法的皇后已全部放置完毕
    if((RowColumn == RowSum))
    {
        PrintResult();
        ++count;

        return;
    }

    // 只有满足了当前皇后和前面所有的皇后摆放位置都不冲突时,才进入下一级递归
    for(int i = 0; i < RowSum; i++)
    {
        c[RowColumn] = i;
        int check = 1;
        for(int j = 0; j < RowColumn; j++)
        {
            /* 若当前行当前列的皇后位置的主副对角线存在与其他皇后冲突
               ,则跳出当前列循环,准备测试当前行下一列是否可行
            */
            if((c[RowColumn] == c[j]) 
                || (RowColumn - j == c[RowColumn] - c[j])
                || (RowColumn - j == c[j] - c[RowColumn]))
            {
                check = 0;
                break;
            }
        }
        if(check == 1)
        {
            EightQueen(RowColumn + 1);
        }
    }
}

int main()
{
    EightQueen(0);

    printf("There are %d solutions to the eight queens problem\n", count);

    system("pause");

    return 0;
}

你可能感兴趣的:(数据结构,学习笔记)