C语言数据结构之用递归解决八皇后问题

1.摘要:

八皇后问题

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


思路:通过思考发现每一行的搜索是否安全、将其置1是重复的,变化的是行数,因此可以构造一个递归函数来解决问题。

2.运行结果:

C语言数据结构之用递归解决八皇后问题_第1张图片


3.代码:

main7.c


#include 

int isSafe(int (*chess)[8],int i,int j);

void eightQueen(int row,int col,int (*chess)[8]);

static int count = 0;
int main(void)
{
    int chess[8][8] = {0};

    eightQueen(0,8,chess);

    printf("一共有种%d可能\n",count);
    return 0;
}

void eightQueen(int row,int n,int (*chess)[8])
{
    int i,j;
    int chess2[8][8];

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

    if(8 == row)
    {
        for(i=0;i<8;i++)
        {
            for(j=0;j<8;j++)
                printf("%d ",chess2[i][j]);

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

    }else{
        for(i=0;i;i++)
        {
            for(j=0;j;j++)
                chess2[row][j]=0;

            if(isSafe(chess2,row,i))
            {
                chess2[row][i] = 1;

                eightQueen(row+1,n,chess2);
            }
        }
    }

}


/**
 * 该点上下、左右、对角线是否已经有皇后
 * @param chess
 * @param i 
 * @param j 
 * @return
 */
int isSafe(int (*chess)[8],int i,int j)
{
    int m,n;

    for(m=0;m<8;m++) //上下
        if(chess[m][j])
            return 0;

    for(m=i,n=j;m>=0 && n>=0;m--,n--) //左上角
        if(chess[m][n])
            return 0;

    for(m=i,n=j;m<8 && n<8;m++,n++) //右下角
        if(chess[m][n])
            return 0;

    for(m=i,n=j;n>=0 && m<8;m++,n--) //右上角
        if(chess[m][n])
            return 0;

    for(m=i,n=j;m>=0 && n<8;n++,m--) //左下角
        if(chess[m][n])
            return 0;

    return 1;
}

你可能感兴趣的:(C/C++)