递归与分治思想:八皇后问题 (在此用递归) (回溯算法的典型题)

Posted zhenglijie

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了递归与分治思想:八皇后问题 (在此用递归) (回溯算法的典型题)相关的知识,希望对你有一定的参考价值。

  1 做法:第一步随便放一个棋子,然后找安全位置放第二个棋子,然后放好后再找安全地放第三个x棋子,以此类推
  2 详细解释:https://www.bilibili.com/video/av76265320?from=search&seid=10595269197283770223
  3 #include<stdio.h>
  4 
  5 int count = 0;
  6 int notdanger(int row, int j, int(*chess)[8])
  7 {
  8     int i,k;
  9     int flag1=0,flag2=0,flag3=0,flag4=0,flag5=0;
 10     
 11     for(i=0; i<8; i++)  //判断列 
 12     {
 13         if( *(*(chess+i)+j) != 0 )
 14         {
 15             flag1 = 1;
 16             break; 
 17         }
 18     }
 19     
 20     for(i=row,k=j; i>=0 && k<8; i--,k++)//判断右上方
 21     {
 22         if( *(*(chess+i)+k) != 0 )
 23         {
 24             flag2 = 1;
 25             break;
 26         }
 27     }
 28     
 29     for(i=row,k=j; i<8 && k>=0; i++,k--)//判断左下方
 30     {
 31         if( *(*(chess+i)+k) != 0 )
 32         {
 33             flag3 = 1;
 34             break;
 35         }
 36     }
 37     
 38     for(i=row,k=j; i<8 && k<8; i++,k++)//判断右下方 
 39     {
 40         if( *(*(chess+i)+k) != 0 )
 41         {
 42             flag4 = 1;
 43             break;
 44         }
 45     }
 46     
 47     for(i=row,k=j; i>=0 && k>=0; i--,k--)//判断左上方 
 48     {
 49         if( *(*(chess+i)+k) != 0 )
 50         {
 51             flag5 = 1;
 52             break;
 53         }
 54     }
 55     
 56     if(flag1 || flag2 || flag3 || flag4 || flag5)
 57     {
 58         return 0;
 59     }
 60     else
 61     {
 62         return 1;
 63     }
 64 }
 65 //row表示起始行
 66 //n表示总列数
 67 //(*chess)[8]表示指向每一行的指针 
 68 void EightQueen(int row, int n, int(*chess)[8])
 69 {
 70     int i,j,k;
 71     int chess2[8][8];
 72     
 73     for(i=0; i<8; i++)
 74     {
 75         for(j=0; j<8; j++)
 76         {
 77             chess2[i][j] = chess[i][j];
 78         }
 79     }
 80     
 81     if(row == 8)
 82     {
 83         printf("这是第 %d 种
",count+1);
 84         for(i=0; i<8; i++)
 85         {
 86             for(j=0; j<8; j++)
 87             {
 88                 printf("%d ",*(*(chess2+i)+j));
 89             }
 90             printf("
");
 91         }
 92         printf("
");
 93         count++;
 94     }
 95     else
 96     {
 97         for(k=0; k<n; k++) //判断此行每一个位置    八个位置都尝试一遍 
 98         {
 99             if(notdanger(row,k,chess))
100             {
101                 for(i=0; i<8; i++)  //回溯 
102                 {
103                     *(*(chess2+row)+i) = 0;
104                 }
105                 *(*(chess2+row)+k) = 1;
106                 
107                 EightQueen(row+1,n,chess2);  //一行放完再放下一行 
108             }
109             
110         }
111     }
112 } 
113 int main(void)
114 {
115     int chess[8][8];
116     int i,j;
117     
118     for(i=0; i<8; i++)
119     {
120         for(j=0; j<8; j++)
121         {
122             chess[i][j] = 0;
123         }
124     }
125     
126     EightQueen(0,8,chess);
127         printf("
一共有 %d 中摆法
",count);
128     return 0;
129 } 

 

以上是关于递归与分治思想:八皇后问题 (在此用递归) (回溯算法的典型题)的主要内容,如果未能解决你的问题,请参考以下文章

N皇后问题(回溯递归思想)

八皇后,回溯与递归(Python实现)

八皇后问题算法详解

数据结构(递归)

递归回溯之八皇后问题详解

Python用迭代(yield)和递归解决八皇后问题