小程序学习:八皇后问题

八皇后问题:

要求:在8 x 8的棋盘上,放置8个皇后,要求不能有2个皇后在同一行、同一列和同一斜线。

输出:解的个数及所有解。

方法:

回溯法,有递归和非递归两种,个人更喜欢非递归方法。以下C代码可以直接编译运行。

非递归版:

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #define N 8
 4 
 5 int num = 0;
 6 int p[N];
 7 
 8 int check(int k)
 9 {
10     int i;
11     for(i = 0; i < k; ++i){
12         if(p[i] == p[k] || (abs(p[k] - p[i]) == k - i))
13             return 0;
14     }
15     return 1;
16 }
17 
18 void print_result(num)
19 {
20     int i;
21     printf("第%d种方案:", num);
22     for(i = 0; i < N; ++i)
23         printf("%d ", p[i] + 1);
24     printf("\n");
25 }
26 
27 void queen()
28 {
29     int k = 0;
30     while(k >= 0){
31         ++p[k];
32         if(p[k] < N && !check(k))
33             continue;
34         if(p[k] == N){
35             p[k] = -1;
36             --k;
37             continue;
38         }
39         if(k == N - 1){
40             ++num;
41             print_result(num);
42         }
43         else
44             ++k;
45     }
46 }
47 
48 int main()
49 {
50     int i;
51     for(i = 0; i < N; ++i)
52         p[i] = -1;
53     queen();
54     printf("八皇后问题共有%d种解法\n", num);
55

递归版: 

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 
 4 #define N 8
 5 
 6 int num = 0;
 7 int p[N];
 8 
 9 int check(int k)
10 {
11     int i;
12     for(i = 0; i < k; ++i){
13         if(p[i] == p[k] || (abs(p[k] - p[i]) == k - i))
14             return 0;
15     }
16     return 1;
17 }
18 
19 void print_result(int num) 
20 {
21     int i;
22     printf("第%d种方案:", num);
23     for(i = 0; i < N; ++i)
24         printf("%d ", p[i] + 1);
25     printf("\n");
26 }
27 
28 void queen(int k)
29 {
30     int i;
31     if(k == N){
32         ++num;
33         print_result(num);
34     } 
35     for(i = 0; i < N; ++i){
36         p[k] = i;
37         if(!check(k))
38             continue;
39         queen(k+1);
40     }
41 }
42 
43 int main()
44 {
45     queen(0);
46     printf("八皇后问题共有%d种解法\n", num);
47 }

 

posted @ 2017-08-26 13:13  扬帆入海  阅读(349)  评论(0编辑  收藏  举报