8皇后问题

来源:互联网 发布:什么是淘宝旺旺号啊 编辑:程序博客网 时间:2024/05/22 01:33


 

8皇后问题

 

描述:

八皇后问题是大数学家高斯于1850年提出来的。该问题是在8×8的国际象棋棋盘上放置8个皇后,使得没有一个皇后能“吃掉”任何其他一个皇后,即没有任何两个皇后被放置在棋盘的同一行、同一列或同一斜线上。

输出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>//要用到绝对值函数

 

inta[8];

intcounter=1;//计数器

 

voidsearch(int m); //递归函数

intcanplace(int row,int col);//判断是否满足八皇后的条件

voidoutput();

 

intmain()

{

  search(0);//初始化为0

}

 

voidsearch(int m)

{

    int i;

       if(m==8)

       {

           output();

       }

   else

   {

       for(i=0;i<8;i++)

          {

               if(canplace(m,i))

               {

                    a[m]=i;

                    search(m+1);

               }

          }     

   }

}

 

intcanplace(int row,int col)

{

    int i,flag=1;

    for(i=0;i<row;i++)

    {

          if(a[i]==col||fabs(row-i)==fabs(col-a[i]))

          {

               flag=0;

               break;

          }

    }

    return(flag);

}

 

voidoutput ()

{

    int i,j;

    printf("No ");

    printf("%d",counter);

    printf(":\n");

    counter++;

    for(i=0;i<8;i++)

    {

          for(j=0;j<8;j++)

          {

               if(j==a[i])printf("A");

               else printf(".");

          }

          printf("\n");

    }

    

}

注意:

  1. 本题用a[m]=j来表示皇后在第m行第j列,所以输出时一行只有一个皇后,故在canplace中无需再判断

  2. 输出时要二重循环才能输出矩阵

  3. a[i]==col 表示同一列的前n-1行中有皇后

  4. fabs(row-i)==fabs(col-a[i])表示在同一斜线上或在同一反斜线上

     

     

     

     

原创粉丝点击