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 }