欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

八皇后

程序员文章站 2022-04-09 21:01:29
原创 八皇后问题是动态规划类算法的经典问题之一,写此博客旨在学习DP,巩固知识,有错误的地方,非常欢迎大家指出。 问题描述:在一个8行8列的宫格中摆放8个皇后,要求每个皇后所在行、所在列、所在45°方向(左上方、左下方、右上方、右下方)不能有其他皇后; 要求算出一共有多少种摆法。 解决方法很简单,在 ......

原创


八皇后问题是动态规划类算法的经典问题之一,写此博客旨在学习DP,巩固知识,有错误的地方,非常欢迎大家指出。

问题描述:在一个8行8列的宫格中摆放8个皇后,要求每个皇后所在行、所在列、所在45°方向(左上方、左下方、右上方、右下方)不能有其他皇后;

要求算出一共有多少种摆法。

解决方法很简单,在宫格中,每一行每一列只能放置一个皇后,这里我以列为单位进行放置皇后(也可以以行为单位放置),在第J列中,从上都下遍历此列的所有宫格,

判断此宫格是否满足条件(行、列、斜方无其他皇后),满足条件放置皇后搜索下一列,不满足条件搜索此列的下一个宫格,如果此列的所有宫格都不满足条件,回到上一列改变

上一列宫格的位置(回溯)重新进入此列搜索;当放置完8个皇后以后计算器+1,回溯,搜索其他位置。

答案:92

 

 1 #include<stdio.h>
 2 
 3 int eight[8][8];
 4 
 5 int count;
 6 
 7 int Judge(int row,int rank)    //判断
 8 {
 9     int i,j;
10     for(j=0;j<=7;j++)    //行 
11         if( eight[row][j]==1 )
12             return 1;
13     
14     for(i=0;i<=7;i++)    //列 
15         if( eight[i][rank]==1 )
16             return 1;
17     
18     for(i=row,j=rank;i>=0 && j>=0;i--,j--)    //左上方 
19         if( eight[i][j]==1 )
20             return 1;
21             
22     for(i=row,j=rank;i>=0 && j<=7;i--,j++)    //右上方
23         if( eight[i][j]==1 )
24             return 1;
25             
26     for(i=row,j=rank;i<=7 && j>=0;i++,j--)    //左下方 
27         if( eight[i][j]==1 )
28             return 1;
29             
30     for(i=row,j=rank;i<=7 && j<=7;i++,j++)    //右下方
31         if( eight[i][j]==1)
32             return 1; 
33         
34     return 0;    
35 }
36 
37 void eightqueen(int rank)
38 {
39     if(rank==8)    //8个皇后放置完毕
40     {
41         count++;
42         return;
43     } 
44     
45     int i;
46     for(i=0;i<=7;i++)    //i代表行下标 
47     {
48         if( Judge(i,rank)==0 )    //满足条件,放置皇后
49         {
50             eight[i][rank]=1;
51             eightqueen(rank+1);
52             eight[i][rank]=0;    //回溯
53         } 
54     }
55 
56 }
57 
58 int main()
59 {
60     eightqueen(0);
61     printf("%d",count);
62     return 0;
63 } 

2018-04-07

上一篇: Python__flask初识

下一篇: 集合运算