八皇后的详细解答,纯手打,求推荐!!!
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("\n"); 23 } 24 printf("**********\n"); 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 }
忘记初始化了- -