八皇后问题

Posted ghost-98210

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了八皇后问题相关的知识,希望对你有一定的参考价值。

八皇后问题:

在8x8格的国际象棋上摆放八个皇后,使其不能够相互攻击,即任意两个皇后都不能处于同一行,同一列或者同一条斜线上

问有多少种摆法?

C语言代码:

  1 //八皇后问题
  2 //在8x8格的国际象棋上摆放八个皇后,使其不能够相互攻击,即任意
  3 //两个皇后都不能处于同一行,同一列或者同一条斜线上。
  4 //问有多少种摆法
  5 #include <stdio.h>
  6 
  7 int count = 0;
  8 
  9 void EightQueen(int row,int n,int (*chess)[8]);
 10 int nodanger(int row,int j,int (*chess)[8]);
 11 
 12 int main()
 13 {
 14     int chess[8][8],j,i;
 15     for(i = 0;i < 8;i++)
 16     {
 17         for(j = 0;j < 8;j++)
 18         {
 19             chess[i][j] = 0;
 20         }
 21     }
 22     EightQueen(0,8,chess);
 23     printf("共有%d种方法
",count);
 24     return 0;
 25 }
 26 void EightQueen(int row,int n,int (*chess)[8])
 27 {
 28     int chess2[8][8],i,j;
 29     for(i = 0;i < 8;i++)
 30     {
 31         for(j = 0;j < 8;j++)
 32         {
 33             chess2[i][j] = chess[i][j];
 34         }
 35     }
 36     if(8 == row)
 37     {
 38         printf("这是第%d种方法
",count);
 39         for(i = 0;i < 8;i++)
 40         {
 41             for(j = 0;j < 8;j++)
 42             {
 43                 printf("%d ",*(*(chess2+i)+j));
 44             }
 45             printf("
");
 46         }
 47         count++;
 48     }
 49     else
 50     {
 51         for(j=0;j < n;j++)
 52         {
 53             if(nodanger(row,j,chess))
 54             {
 55                 for(i=0;i<8;i++)
 56                 {
 57                     *(*(chess2+row)+i) = 0;
 58                 }
 59                 *(*(chess2+row)+j) = 1;
 60                 EightQueen(row+1,n,chess2);
 61             }
 62         }
 63     }
 64 }
 65 
 66 int nodanger(int row,int j,int (*chess)[8])
 67 {
 68     int i,k,flag1 = 0,flag2 = 0,flag3 = 0,flag4 = 0,flag5 = 0;
 69     //判断同一行是否危险
 70     for(i=0;i<8;i++)
 71     {
 72         if(*(*(chess+i)+j) != 0)
 73         {
 74             flag1 = 1;
 75             break;
 76         }
 77     }
 78     //判断左上方
 79     for(i=row,k=j;i>=0 && k>=0;i--,k--)
 80     {
 81         if(*(*(chess+i)+k) != 0)
 82         {
 83             flag2 = 1;
 84             break;
 85         }
 86     }
 87     //判断右下方
 88     for(i=row,k=j;i<8 && k<8;i++,k++)
 89     {
 90         if(*(*(chess+i)+k) != 0)
 91         {
 92             flag3 = 1;
 93             break;
 94         }
 95     }
 96     //判断右上方
 97     for(i=row,k=j;i>=0 && k<8;i--,k++)
 98     {
 99         if(*(*(chess+i)+k) != 0)
100         {
101             flag4 = 1;
102             break;
103         }
104     }
105     for(i=row,k=j;i<8 && k>=0;i++,k--)
106     {
107         if(*(*(chess+i)+k) != 0)
108         {
109             flag5 = 1;
110             break;
111         }
112     }
113     if(flag1 || flag2 || flag3 || flag4 || flag5)
114     {
115         return 0;
116     }
117     else
118     {
119         return 1;
120     }
121 }

输出结果如下:

技术分享图片

 



以上是关于八皇后问题的主要内容,如果未能解决你的问题,请参考以下文章

八皇后,回溯与递归(Python实现)

基于WPF的八皇后简单应用程序

八皇后问题的遗传算法解法,c语言编写

八皇后问题

八皇后

八皇后问题