八皇后之递归解法

View Code
 1 #include <iostream>
2 using namespace std;
3
4 int q[8][8];//棋盘
5 int mark_row[8];//行方向的安放状态
6 int mark_column[8];//列方向的安放状态
7 int mark_pos_slash[15];//正斜线方向的安放状态,正斜线定义为斜率为正的斜线
8 int mark_neg_slash[15];//反斜线方向的安放状态,反斜线定义为斜率为负的斜线
9 int cnt;//记录有多少种合法布局
10
11 void initialize()
12 {//初始化,棋盘、4个标志数组
13 for(int i = 0; i < 8; i++)
14 for(int j = 0; j < 8; j++)
15 q[i][j] = 0;
16 for(int i = 0; i < 8; i++)
17 mark_row[i] = mark_column[i] = 0;
18 for(int i = 0; i < 16; i++)
19 mark_pos_slash[i] = mark_neg_slash[i] = 0;
20 cnt = 0;
21 }
22
23 void print_queen()
24 {//打印8个皇后在棋盘上的一种合法布局
25 cout << "" << cnt << "种布局方式:" << endl;
26 cout << "=================" << endl;
27 for(int i = 0; i < 8; i++){
28 for(int j = 0; j < 8; j++)
29 cout << q[i][j] << " ";
30 cout << endl;
31 }
32 cout << endl;
33 }
34
35 //order表示当前是在第几行安放棋子,取值为0~7
36 void queen_8(int order)
37 {
38 for(int j = 0; j < 8; j++){
39 if(!mark_row[order] && !mark_column[j]
40 && !mark_pos_slash[order+j] && !mark_neg_slash[order-j+7]){
41 //表示当前位置所在行、列、正斜、反斜方向都没有棋子
42 q[order][j] = 1;//安放棋子
43 mark_row[order] = 1;//记录行、列、正斜、反斜的安放状态
44 mark_column[j] = 1;
45 mark_pos_slash[order+j] = 1;
46 mark_neg_slash[order-j+7] = 1;
47 if(order < 7)
48 queen_8(order+1);
49 else{//表示刚刚安放的是第8行的棋子,找到了一种布局方式
50 //此时order为7,即试探的是第8行的棋子,试探完这一行,即结递归,开始返回
51 cnt++;
52 print_queen();
53 }
54 //恢复,继续查找这一行可能的其它的布局方式
55 q[order][j] = 0;
56 mark_row[order] = 0;
57 mark_column[j] = 0;
58 mark_pos_slash[order+j] = 0;
59 mark_neg_slash[order-j+7] = 0;
60 }//end if
61 }//end for
62 }
63
64 int main()
65 {
66 initialize();
67 queen_8(0);//参数 0 表示从第一行开始安放棋子
68 cout << "所以,八皇后问题总共" << cnt << "种解法。" << endl;
69 return 0;
70 }
posted @ 2011-10-12 22:53  crazykeyboard  阅读(185)  评论(0编辑  收藏  举报