【Acm】八皇后问题

八皇后问题,是一个古老而著名的问题,是回溯算法的典型例题。

其解决办法和我以前发过的【算法之美—Fire Netwww.cnblogs.com/lcw/p/3159414.html】类似

题目:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。

  1 #include <stdio.h>
  2 
  3 int count = 0;    //全局变量,统计所有解法
  4 
  5 int notDanger( int row, int j, int (*chess)[8] )    //判断是否存在危险
  6 {
  7     int i, k, flag1=0, flag2=0, flag3=0, flag4=0, flag5=0;
  8 
  9     // 判断列方向
 10     for( i=0; i < 8; i++ )
 11     {
 12         if( *(*(chess+i)+j) != 0 )
 13         {
 14             flag1 = 1;
 15             break;
 16         }
 17     }
 18 
 19     // 判断左上方
 20     for( i=row, k=j; i>=0 && k>=0; i--, k-- )
 21     {
 22         if( *(*(chess+i)+k) != 0 )
 23         {
 24             flag2 = 1;
 25             break;
 26         }
 27     }
 28 
 29     // 判断右下方
 30     for( i=row, k=j; i<8 && k<8; i++, k++ )
 31     {
 32         if( *(*(chess+i)+k) != 0 )
 33         {
 34             flag3 = 1;
 35             break;
 36         }
 37     }
 38 
 39     // 判断左下方
 40     for( i=row, k=j; i>=0 && k<8; i--, k++ )
 41     {
 42         if( *(*(chess+i)+k) != 0 )
 43         {
 44             flag4 = 1;
 45             break;
 46         }
 47     }
 48 
 49     // 判断右上方
 50     for( i=row, k=j; i<8 && k>=0; i++, k-- )
 51     {
 52         if( *(*(chess+i)+k) != 0 )
 53         {
 54             flag5 = 1;
 55             break;
 56         }
 57     }
 58 
 59     if( flag1 || flag2 || flag3 || flag4 || flag5 )
 60     {
 61         return 0;
 62     }
 63     else
 64     {
 65         return 1;
 66     }
 67 }
 68 
 69 // 参数 row:表示起始行
 70 // 参数 n:表示列数
 71 // 参数 (*chess)[8]: 表示指向棋盘每一行的指针
 72 void EightQueen( int row, int n, int (*chess)[8] )
 73 {
 74     int chess2[8][8], i, j;
 75 
 76     for( i=0; i < 8; i++ )
 77     {
 78         for( j=0; j < 8; j++ )
 79         {
 80             chess2[i][j] = chess[i][j];
 81         }
 82     }
 83 
 84     if( 8 == row )    //本次解法完毕
 85     {
 86         printf("第 %d 种 
", count+1);
 87         for( i=0; i < 8; i++ )
 88         {
 89             for( j=0; j < 8; j++ )
 90             {
 91                 printf("%d ", *(*(chess2+i)+j));
 92             }
 93             printf("
");
 94         }
 95         printf("
");
 96         count++;
 97     }
 98     else
 99     {
100         for( j=0; j < n; j++ )
101         {
102             if( notDanger( row, j, chess ) ) // 判断这个位置是否存在危险
103             {
104                 for( i=0; i < 8; i++ )
105                 {
106                     *(*(chess2+row)+i) = 0;
107                 }
108                 
109                 *(*(chess2+row)+j) = 1;
110 
111                 EightQueen( row+1, n, chess2 );    //没有危险,继续往下
112             }
113         }
114     }
115 }
116 
117 int main()
118 {
119     freopen( "output.txt", "w", stdout );    //将输出结果保存到 output.txt中
120 
121     int chess[8][8], i, j;
122 
123     for( i=0; i < 8; i++ )
124     {
125         for( j=0; j < 8; j++ )
126         {
127             chess[i][j] = 0;
128         }
129     }
130 
131     EightQueen( 0, 8, chess );
132 
133 
134     printf("总共有 %d 种解决方法 

", count);
135 
136     fclose(stdout);
137     return 0;
138 }
View Code
原文地址:https://www.cnblogs.com/lcw/p/3162392.html