8皇后问题(改编)数组
注释:递归题。测试
棋盘:qipan[i][j];spa
递归参数:当前行:begin;当前八皇后所在格子数字之和:sum;code
递归出口:至多有8个皇后;blog
每轮操做都要判断选中位置的行、列、斜三个位置上是否有其余皇后,有则不能放,不然递归下一行(sum=sum+qipan[i][j])——注意标记数组在每一次递归后要恢复。递归
1 /* 2 测试数据: 3 1 2 3 4 5 6 7 8 4 9 10 11 12 13 14 15 16 5 17 18 19 20 21 22 23 24 6 25 26 27 28 29 30 31 32 7 33 34 35 36 37 38 39 40 8 41 42 43 44 45 46 47 48 9 48 50 51 52 53 54 55 56 10 57 58 59 60 61 62 63 64 11 */ 12 #include<stdio.h> 13 int max=0,sum;//max表预设一个最大值,sum表所放皇后的位置的元素和 14 int lie[9];//表明一竖n行 15 int xie1[2*8];//表明从↖到↘对角线 16 int xie2[2*8];//表明从↘到↖对角线 17 int qipan[9][9];//棋盘权值 18 int ans=0; 19 void HuangHou(int begin,int sum){ 20 if(begin>8){//表示搜索到了第八行,说明这次为有效搜索 21 if(sum>max){ 22 max = sum;//max用来存放最大值 23 } 24 ans++; 25 }else{ 26 for(int i=1;i<=8;i++){//表每次搜索都是从第一列开始的 27 if(lie[i]==0 && xie1[begin+i-1]==0 && xie2[begin-i+8]==0){ 28 lie[i]=1; 29 xie1[begin+i-1]=1; 30 xie2[begin-i+8]=1; 31 HuangHou(begin+1,sum+qipan[begin][i]);//搜索下一行 32 lie[i]=0; 33 xie1[begin+i-1]=0; 34 xie2[begin-i+8]=0; 35 } 36 } 37 } 38 } 39 int main(){ 40 for(int i=1;i<=8;i++){//录入棋盘 41 for(int j=1;j<=8;j++){ 42 scanf("%d",&qipan[i][j]); 43 } 44 } 45 HuangHou(1,0);//从第一行开始搜索 46 printf("总方案数:%d\n格子值最大的:%d",ans,max); 47 return 0; 48 }