八皇后问题解法二

 

//在八个皇后的问题中,不必要所有的格子都检查过,例如若某列检查过,

//该列的其它格子就不用再检查了,这个方法称为分支修剪。

 

#include <stdio.h>

#include <stdlib.h>

#define N 5

 

int column[N+1]; // 同行是否有皇后,1表示有

int rup[2*N+1]; // 右上至左下是否有皇后

int lup[2*N+1]; // 左上至右下是否有皇后

int queen[N+1] = {0};

int num; // 解答编号

 

void backtrack(int); // 递回求解

 

int main(void)

{

    int i;

    num = 0;

 

    for(i = 1; i <= N; i++)

        column[i] = 0;

 

    for(i = 1; i <= 2*N; i++)

        rup[i] = lup[i] =0;

 

    backtrack(1);

 

    return 0;

}

//打印皇后的排列方法

void showAnswer()

{

    int x, y;

    printf("\n解答 %d\n", ++num);

    for(x = 1; x <= N; x++)

       {

        for(y = 1; y <= N; y++)

              {

            if(queen[x] == y)

                printf(" Q");

            else

                printf(" .");

        }

        printf("\n");

    }

}

 

void backtrack(int i) //在第i行摆放第i个皇后

{

    int j;              //j表示列数  

 

    if(i > N)  //已经摆完,打印摆法

       {

        showAnswer();

    }

    else

       {

        for(j = 1; j <= N; j++)

              {

            if(column[j] == 0 && rup[i+j] == 0 && lup[i-j+N] == 0)

                     {

                queen[i] = j; // 第i行的第i个皇后所在的列为j

               

                column[j] = rup[i+j] = lup[i-j+N] = 1; //该皇后所在的列,对角线标记为1

                backtrack(i+1);             //接着进入回溯算法,摆放下一个皇后

                column[j] = rup[i+j] = lup[i-j+N] = 0; //一种摆法结束后,退出递归栈,该位置的列,对角线重新置为0,

            }                                                                           //判断上一个皇后摆完后其它可行的摆法,若没有该行,则只有一种摆法

        }

    }

}

你可能感兴趣的:(八皇后问题解法二)