经典问题“八皇后”的解法

八皇后问题,是一个古老而著名的问题,是回溯算法的典型例题。该问题是十九世纪著名的数学家高斯1850年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。 高斯认为有76种方案。1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果。

 1 #include<stdio.h>
 2 void fun(int i,int j);
 3 static b[8][8];
 4 void main()
 5     {
 6     fun(0,0);
 7  
 8     }
 9 int knock(int i,int j)
10         {int temp_i,temp_j,k;
11         temp_i=i;temp_j=j;
12         for(i=i-1;i>=0;i--)
13             if(b[i][j]==1)
14                 return 1;
15          for(i=temp_i-1,k=temp_j+1,j=temp_j-1;i>=0;i--,j--,k++)
16                 {if(j>=0&&b[i][j]==1)
17                     return 1;
18                 if(k<8&&b[i][k]==1)
19                     return 1;
20                 }
21         return 0;
22         }
23 void cls(int i)
24         {int j;
25         for(;i<8;i++)
26             {
27             for(j=0;j<8;j++)
28                 b[i][j]=0;
29             }
30  
31         }
32 void print(void)
33         {int i,j;static int n=1;
34          printf("--------------------------\n第%d种\n",n++);
35             for(j=0;j<8;j++)
36                 {
37                 for(i=0;i<8;i++)
38                     {if(b[i][j]==1)
39                         printf("* ");
40                      else
41                         printf("0 ");
42                     }
43                 printf("\n");
44  
45                 }
46            printf("\n");//    getchar();
47         }
48 void fun(int i,int j)
49         {if(i<8)
50             {
51             for(;j<8;j++)
52                 {cls(i);
53                 if(knock(i,j)==1)
54                     continue;
55                 b[i][j]=1;     
56                 fun(i+1,0);
57                 }
58  
59             }
60         else
61             print();
62         }

 


<script type="text/javascript"> </script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值