8皇后问题

八皇后问题,一个古老而著名的问题,是回溯算法的典型案例。该问题由国际西洋棋棋手马克斯·贝瑟尔于 1848 年提出:在 8×8 格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。

正确答案92种。

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 #include<string.h>
 4 int num = 0;
 5 int q[9];//第i个皇后所在列
 6 int c[9];//标记当前列是否安全
 7 int l[17];//标记主对角线是否安全
 8 int r[17];//标记斜对角线是否安全
 9 void queue(int i)
10 {
11     int j,k;
12     for(j=1; j<=8; j++)//对第i行每一列运算
13     {
14         if(c[j]&&l[i-j+9]&&r[i+j])//如果安全,否则遍历完8个后就回到上一次调用
15         {
16             q[i] = j;//记录第i行皇后在哪一列
17             c[j] = 0;
18             l[i-j+9] = 0;
19             r[i+j] = 0;//不安全
20             if(i<8)//如果不是最后一行
21                 queue(i+1);//递归
22             else//最后一行,开始回溯
23             {
24                 num++;
25                 printf("方案%2d:",num);
26                 for(k=1; k<=8; k++)
27                     printf("%d ",q[k]);
28                 printf("\n");
29             }
30             c[j] = 1;
31             l[i-j+9] = 1;
32             r[i+j] = 1;//回溯完毕,都解除为安全
33         }
34     }
35 }
36 int main()
37 {
38     memset(c,1,sizeof(c));
39     memset(l,1,sizeof(l));
40     memset(r,1,sizeof(r));
41     queue(1);
42     return 0;
43 }

 

posted @ 2020-06-09 00:00  爱写程序的机械师  阅读(112)  评论(0)    收藏  举报