⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄

📁 运用递归来解N皇后问题
💻
字号:
/*递归 实验  运用递归来解N皇后问题。           */

/*===============================================*/
/*程序构思:                                     */
/*必须先判断传入的坐标位置是否可放置皇后。       */
/*(判断譔坐标上、下、左、右、左上、右上、左下、右下八个方向是否有其它的皇后,*/
/*有返回false,无返回true。                      */
/*假设传入的坐标为(LocX, LocY),棋盘大小为N*N。  */
/*坐标上方:(LocX, LocY-1)到(LocX, 0)是否有其它的皇后。*/
/*坐标下方:(LocX, LocY+1)到(LocX, N-1)是否有其它的皇后。*/
/*坐标左方:(LocX-1, LocY)到(0, LocY)是否有其它的皇后。*/
/*坐标右方:(LocX+1, LocY)到(N-1, LocY)是否有其它的皇后。*/
/*坐标左上方:(LocX-1, LocY-1)到(LocX, 0)或(0, LocY)是否有其它的皇后。*/
/*坐标右上方:(LocX+1, LocY-1)到(LocX, 0)或(N-1, LocY)是否有其它的皇后。*/
/*坐标左下方:(LocX-1, LocY+1)到(LocX, N-1)或(0, LocY)是否有其它的皇后。*/
/*坐标右下方:(LocX+1, LocY+1)到(LocX, N-1)或(N-1, LocY)是否有其它的皇后。*/
/*递归结束条件:当N个皇后皆放置成功。            */
/*递归执行部分:判断传入坐标是否可放置皇后,可以放置则依序递归放置下一个皇后。*/

/*===============================================*/
/*程序源代码                                     */
/*==============Program Description==============*/
/*程序名称: recursive02.c                        */
/*程序目的: 运用递归来解N皇后问题                */
/*程序提供: 马春江                               */
/*===============================================*/
char Chessboard[8][8];        /*声明8*8的空白棋盘*/

/*===============================================*/
/*递归解N皇后问题                                */
/*===============================================*/
int N_Queens(int LocX, int LocY, int Queens)
{
    int i, j;                 /*循环计数变量     */
    int Result=0;

    if (Queens==8)            /*递归结束条件     */
        return 1;
    else
        if (QueensPlace(LocX, LocY))
        {
            Chessboard[LocX][LocY]='Q';
            for (i=0; i<8; i++)
                for (j=0; j<8; j++)
                {
                    Result+=N_Queens(i, j, Queens+1);
                    if (Result>0)
                        break;
                }
            if (Result>0)
                return 1;
            else
            {
                ChessboardpLocX][LocY]='X';
                Return 0;
            }
        }
        else
            return 0;
}

/*===============================================*/
/*判断传入坐标是否可放置皇后                     */
/*===============================================*/
int Queen Place (int LocX, int LocY)
{
    int i, j;

    if (Chessboard[LocX][LocY]!='X')       /*判断是否有皇后          */
        return 0;

    for (j=LocY-1; j>=0; j--)              /*判断上方是否有皇后      */
        if (Chessboard[LocX][j]!='X')
            return 0;

    for (j=LocY+1; j<8; j++)               /*判断下方是否有皇后      */
        if (Chessboard[LocX][j]!='X')
            return 0;

    for (i=LocX-1; i>=0; i--)              /*判断左方是否有皇后      */
        if (Chessboard[i][LocY]!='X')
            return 0;

    for (i=LocX+1; i<8; i++)               /*判断右方是否有皇后      */
        if (Chessboard[i][LocY]!='X')
            return 0;

    i=LocX-1;
    j=LocY-1;
    while (i>=0 && j>=0)                   /*判断左上方是否有皇后    */
        if (Chessboard[i--][j--]!='X')
            return 0;

    i=LocX+1;
    j=LocY-1;
    while (i<8 && j>=0)                    /*判断右上方是否有皇后    */
        if (Chessboard[i++][j--]!='X')
            return 0;

    i=LocX-1;
    j=LocY+1;
    while (i>=0 && j<8)                    /*判断左下方是否有皇后    */
        if (Chessboard[i--][j++]!='X')
            return 0;

    i=LocX+1;
    j=LocY+1;
    while (i<8 && j<8)                     /*判断右下方是否有皇后    */
        if (Chessboard[i++][j++]!='X')
            return 0;
    return 1;
}

/*===============================================*/
/*主程序                                         */
/*===============================================*/
void main()
{
    int i, j;                              /*循环计数变量           */
    
    for (i=0; i<8; i++)
        for (j=0; j<8; j++)
            Chessboard[i][j]='X';
    N_Queens (0, 0, 0);

    printf ("The graph of 8 Queens on the Chessboard. \n");
    printf ("     0   1   2   3   4   5   6   7  \n");
    printf ("   +---+---+---+---+---+---+---+---+\n");

    for (i=0; i<8; i++)
    {
        printf (" %d |", i);
        for (j=0; j<8; j++)
            printf ("-%c-|, Chessboard[i][j]);
        printf ("\n   +---+---+---+---+---+---+---+---+\n");
    }
}

/*希望的结果                                            */
/*The graph of 8 Queens on the Chessboard.              */
/*    0   1   2   3   4   5   6   7                     */
/*  +---+---+---+---+---+---+---+---+                   */
/*0 |-Q-|-X-|-X-|-X-|-X-|-X-|-X-|-X-|                   */
/*  +---+---+---+---+---+---+---+---+                   */
/*1 |-X-|-X-|-X-|-X-|-Q-|-X-|-X-|-X-|                   */
/*  +---+---+---+---+---+---+---+---+                   */
/*2 |-X-|-X-|-X-|-X-|-X-|-X-|-X-|-Q-|                   */
/*  +---+---+---+---+---+---+---+---+                   */
/*3 |-X-|-X-|-X-|-X-|-X-|-Q-|-X-|-X-|                   */
/*  +---+---+---+---+---+---+---+---+                   */
/*4 |-X-|-X-|-Q-|-X-|-X-|-X-|-X-|-X-|                   */
/*  +---+---+---+---+---+---+---+---+                   */
/*5 |-X-|-X-|-X-|-X-|-X-|-X-|-Q-|-X-|                   */
/*  +---+---+---+---+---+---+---+---+                   */
/*6 |-X-|-Q-|-X-|-X-|-X-|-X-|-X-|-X-|                   */
/*  +---+---+---+---+---+---+---+---+                   */
/*7 |-X-|-X-|-X-|-Q-|-X-|-X-|-X-|-X-|                   */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -