八皇后问题(回溯_排列树)

时限:1000ms 内存限制:10000K 总时限:3000ms

描述:

输出8皇后问题所有结果。

输入:

没有输入。

输出:

每个结果第一行是No n:的形式,n表示输出的是第几个结果;下面8行,每行8个字符,‘A’表示皇后,‘.’表示空格。不同的结果中,先输出第一个皇后位置靠前的结果;第一个皇后位置相同,先输出第二个皇后位置靠前的结果;依次类推。

输入样例:

 

输出样例:

输出的前几行:

No 1:

A.......

....A...

.......A

.....A..

..A.....

......A.

.A......

...A....

No 2:

A.......

.....A..

.......A

..A.....

......A.

...A....

.A......

....A...

#include<stdio.h>

#include<math.h>



void NQueens(int m);

bool canplace(int t);

void print(); 

#define N 8

int Array[9]={0};//针对八皇后设的数组(Array[0]不用)

int sum=0;



int main()

{

   NQueens(1);

   return 0;

}

void NQueens(int m)//m=1~8

{

   if(m>N)

   { sum++;   print(); }

   else   

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

      {

          Array[m]=i;

          if(canplace(m))

             NQueens(m+1);

      }

}

void print()

{

    int i,j;

    printf("NO%d:\n",sum);

    for(i=1;i<=N;i++)//每一行

    {

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

        {    if(Array[i]==j)

                printf("A");

            else

                printf("*");

        }

        printf("\n");

    }

}

bool canplace(int t)//第t行放上数后判断是否可行

{

    for(int i=1;i<t;i++)

        if(Array[i]==Array[t] ||abs(t-i)==abs(Array[t]-Array[i]) )

            return false;

    return true;

}

 

 

你可能感兴趣的:(八皇后)