码迷,mamicode.com
首页 > 其他好文 > 详细

八皇后问题

时间:2018-08-16 00:44:19      阅读:142      评论:0      收藏:0      [点我收藏+]

标签:inf   ret   std   输出   alt   相互   语言   count   oda   

八皇后问题:

在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种方法\n",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种方法\n",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("\n");
 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 }

输出结果如下:

技术分享图片

 

八皇后问题

标签:inf   ret   std   输出   alt   相互   语言   count   oda   

原文地址:https://www.cnblogs.com/ghost-98210/p/9484477.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!