八皇后问题(C语言)

  看Python的时候看到八皇后问题,在百度上搜了一下,百科里有各种语言的算法实现,却没有C语言的实现,虽然我知道网上有无数的C语言实现,还是决定自己写一个,也顺便训练一下自己的建模能力,虽然比较简单。

  以下来自百度百科:

  八皇后问题(英文:Eight queens),是由国际西洋棋棋手马克斯·贝瑟尔于1848年提出的问题,是回溯算法的典型案例。

  问题表述为:在8×8格的国际象棋上摆放8个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。高斯认为有76种方案。1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果。如果经过±90度、±180度旋转,和对角线对称变换的摆法看成一类,共有42类。计算机发明后,有多种计算机语言可以编程解决此问题。

  这里我使用两种方法实现了八皇后问题,第一种 用最笨的全循环,第二种 用递归实现。

  下面就贴代码吧。

实现方法一:

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 
  4 //打印结果
  5 int eqdisp(int* qpos, int count)
  6 {
  7     int ii = 0, jj = 0;
  8     int ret = 0;
  9 
 10     printf("=======%02d========\n", count);
 11 
 12     for(ii=0; ii<8; ii++)
 13     {
 14         for(jj=0; jj<8; jj++)
 15         {
 16             if(qpos[ii] == jj)
 17             {
 18                 printf(" *");
 19             }
 20             else
 21             {
 22                 printf(" -");
 23             }
 24         }
 25         printf("\n");
 26     }
 27     printf("-----------------\n");
 28     
 29     return ret;
 30 }
 31 
 32 //判断不符合情况
 33 int IsConflict(int* qpos, int deep)
 34 {
 35     int ret = 0;
 36     int ii = 0;
 37     int flag = 0;
 38 
 39     for(ii=0; ii<deep; ii++)
 40     {
 41         if(qpos[deep] == qpos[ii])
 42         {
 43             ret = -1;
 44             return ret;
 45         }
 46         if((qpos[deep] == (qpos[ii]+(deep-ii))) || (qpos[deep]+(deep-ii) == (qpos[ii])))
 47         {
 48             ret = -2;
 49             return ret;
 50         }
 51     }
 52     return ret;
 53 }
 54 
 55 //主算法实现
 56 int eightqueen()
 57 {
 58     int queenposition[8] = {0};
 59     int ii = 0, jj = 0, kk = 0, ll = 0, mm = 0, nn = 0, oo = 0, pp = 0, qq = 0;
 60     int count = 0;
 61 
 62     for(ii=0; ii<8; ii++)
 63     {
 64         queenposition[0] = ii;
 65         for(jj=0; jj<8; jj++)
 66         {
 67             queenposition[1] = jj;
 68             if(IsConflict(queenposition, 1))
 69             {
 70                 continue;
 71             }
 72             for(kk=0; kk<8; kk++)
 73             {
 74                 queenposition[2] = kk;
 75                 if(IsConflict(queenposition, 2))
 76                 {
 77                     continue;
 78                 }
 79                 for(ll=0; ll<8; ll++)
 80                 {
 81                     queenposition[3] = ll;
 82                     if(IsConflict(queenposition, 3))
 83                     {
 84                         continue;
 85                     }
 86                     for(mm=0; mm<8; mm++)
 87                     {
 88                         queenposition[4] = mm;
 89                         if(IsConflict(queenposition, 4))
 90                         {
 91                             continue;
 92                         }
 93                         for(nn=0; nn<8; nn++)
 94                         {
 95                             queenposition[5] = nn;
 96                             if(IsConflict(queenposition, 5))
 97                             {
 98                                 continue;
 99                             }
100                             for(oo=0; oo<8; oo++)
101                             {
102                                 queenposition[6] = oo;
103                                 if(IsConflict(queenposition, 6))
104                                 {
105                                     continue;
106                                 }
107                                 for(pp=0; pp<8; pp++)
108                                 {
109                                     queenposition[7] = pp;
110                                     if(IsConflict(queenposition, 7))
111                                     {
112                                         continue;
113                                     }
114                                     count++;
115                                     eqdisp(queenposition, count);
116                                     #if 0
117                                     printf("The result[%d]:\n", count);
118                                     for(qq=0; qq<8; qq++)
119                                     {
120                                         printf("(%d, %d) ", qq, queenposition[qq]);
121                                     }
122                                     printf("\n");
123                                     #endif
124                                 }
125                             }
126                         }
127                     }
128                 }
129             }
130         }
131     }
132     printf("The total Result is [%d]\n", count);
133     
134     return 0;
135 }
136 
137 int main()
138 {
139     eightqueen();
140     return 0;
141 }

实现方法二:

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 
 4 //打印结果
 5 int eqdisp(int* qpos, int count)
 6 {
 7     int ii = 0, jj = 0;
 8     int ret = 0;
 9 
10     printf("=======%02d========\n", count);
11 
12     for(ii=0; ii<8; ii++)
13     {
14         for(jj=0; jj<8; jj++)
15         {
16             if(qpos[ii] == jj)
17             {
18                 printf(" *");
19             }
20             else
21             {
22                 printf(" -");
23             }
24         }
25         printf("\n");
26     }
27     printf("-----------------\n");
28     
29     return ret;
30 }
31 
32 //判断不符合情况
33 int IsConflict(int* qpos, int deep)
34 {
35     int ret = 0;
36     int ii = 0;
37     int flag = 0;
38 
39     for(ii=0; ii<deep; ii++)
40     {
41         if(qpos[deep] == qpos[ii])
42         {
43             ret = -1;
44             return ret;
45         }
46         if((qpos[deep] == (qpos[ii]+(deep-ii))) || (qpos[deep]+(deep-ii) == (qpos[ii])))
47         {
48             ret = -2;
49             return ret;
50         }
51     }
52     return ret;
53 }
54 
55 //主算法实现
56 int eightqueen(int* qpos, int deep, int* count)
57 {
58     int ii = 0;
59     int curdeep = 8-deep;
60 
61     if(!deep)
62     {
63         (*count)++;
64         eqdisp(qpos, *count);
65     }
66     else
67     {
68         for(ii=0; ii<8; ii++)
69         {
70             qpos[curdeep] = ii;
71             if(IsConflict(qpos, curdeep))
72             {
73                 continue;
74             }
75             else
76             {
77                 eightqueen(qpos, deep-1, count);
78             }
79         }
80     }
81     
82     return 0;
83 }
84 
85 int main()
86 {
87     int count = 0;
88     int queenposition[8] = {0};
89     eightqueen(queenposition, 8, &count);
90     printf("The total Result is [%d]\n", count);
91     
92     return 0;
93 }

 

 执行结果完全一样,见下图:

posted @ 2021-05-27 15:37  青原白鹿  阅读(862)  评论(0)    收藏  举报