八皇后问题(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 }
执行结果完全一样,见下图:


浙公网安备 33010602011771号