8皇后问题



 

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]) 表示在同一斜线上或在同一反斜线上

     

     

     

     

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值