N皇后问题

N皇后问题是一个经典的问题,在一个N*N的棋盘上放置N个皇后,每行一个并使其不能互相攻击(同一行、同一列、同一斜线上的皇后都会自动攻击)

 1 #include <iostream> 
 2 #include <cmath>
 3 using namespace std; 
 4  
 5 #define N 4
 6  
 7 bool matrix[N + 1][N + 1] = {0}; 
 8  
 9 bool IsLegal(bool matrix[N + 1][N + 1], const int &i, const int &j) 
10 { 
11     //  判断前面的i-1个棋子与matrix[i][j]是否冲突,i为1时合法 
12  
13     for (int m = 1; m <= i - 1; ++m) { 
14         for (int n = 1; n <= N; ++n) {   //  实际每一行只有一个棋子 
15             if (matrix[m][n] == 1) { 
16                 if ( n == j || abs(i - m) == abs(j - n) )   //  key, not bad 
17                     return false; 
18             } 
19         } 
20     } 
21     return true; 
22 } 
23  
24 void Print(bool matrix[N + 1][N + 1]) 
25 { 
26     static int count = 1; 
27     printf("Case %d:\n", count++); 
28     for (int i = 1; i <= N; i++) { 
29         for (int j = 1; j <= N; j++) { 
30             matrix[i][j] == 1 ? printf("%c ", 2) : printf(". "); 
31         } 
32         cout << endl; 
33     } 
34     cout << endl; 
35 } 
36  
37 void Trial(const int i) 
38 { 
39     //  进入本函数时,在N*N的棋盘前i-1行已放置了互不攻击的i-1个棋子 
40     //  现从第i行起继续为后续棋子选择合适位置 
41  
42     if (i > N)   //  输出当前的合法布局 
43         Print(matrix); 
44     else 
45         for (int j = 1; j <= N; ++j) { 
46             matrix[i][j] = 1; 
47             if ( IsLegal(matrix, i, j) ) 
48                 Trial(i + 1); 
49             matrix[i][j] = 0; 
50         } 
51 } 
52  
53 int main(void) 
54 { 
55     Trial(1); 
56  
57     return 0; 
58 }

打印结果:

 

posted on 2016-04-30 15:17  wxdjss  阅读(198)  评论(0编辑  收藏  举报

导航