八皇后的详细解答,纯手打,求推荐!!!

 1 #include <iostream>
 2 #include<cstdio>
 3 #include<cmath>
 4 #include<cstring>
 5 using namespace std;
 6 int a[9][9];//将隐式树转化成显式树,即变成数据结构中的八叉树,寻找每一条合适的路径
 7 int count=0;//计数器
 8 //初始化数组a
 9 void init()
10 {
11     for(int i=1; i<=8; i++)
12         for(int j=1; j<8; j++)
13             a[i][j]=0;
14 }
15 //输出一组八皇后的值
16 void output()
17 {
18     for(int i=1; i<9; i++)
19     {
20         for(int j=1; j<9; j++)
21             printf("%d",a[i][j]);
22         printf("
");
23     }
24     printf("**********
");
25 }
26  //检查每一个点能否放置,即是否符合规则
27 int check(int i,int k)
28 {
29     int t=0;
30     for(int j=1; j<=i-1; j++)
31     {
32         for(int j1=1; j1<9; j1++)
33             if(abs(j-i)==abs(k-j1)&&a[j][j1]==1)//在写线上有值
34                 t=1;
35         if(a[j][k]==1)//在垂直线上有值
36             t=1;
37     }
38     if(t==0)
39         return 1;
40     else
41         return 0;
42 
43 }
44 void try1(int i)//运用了回溯法,递归,和深度优先搜索,对每一行开始
45 {
46     for(int k=1; k<=8; k++)//对每一列开始检查
47     {
48         if(check(i,k)==1)//如果符合,进行dfs
49         {
50             a[i][k]=1;
51             if(i==8){
52                 output();
53                 count++;//记录一组八皇后的值
54             }
55             else
56                 try1(i+1);//逐步递归,直至i==8
57             a[i][k]=0;// 清理现场
58         }
59     }
60 }
61 int main()
62 {
63     try1(1);//从1开始
64     cout<<count<<endl;
65     return 0;
66 }

 忘记初始化了- -

原文地址:https://www.cnblogs.com/calmwithdream/p/5294406.html