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

时限: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;
}
原文地址:https://www.cnblogs.com/IThaitian/p/2581742.html