C語言 · 8皇后問題改編

8皇后問題(改編)數組

問題描述
  規則同8皇后問題,可是棋盤上每格都有一個數字,要求八皇后所在格子數字之和最大。
輸入格式
  一個8*8的棋盤。
輸出格式
  所能獲得的最大數字和
樣例輸入
1 2 3 4 5 6 7 8
9 10 11 12 13 14 15 16
17 18 19 20 21 22 23 24
25 26 27 28 29 30 31 32
33 34 35 36 37 38 39 40
41 42 43 44 45 46 47 48
48 50 51 52 53 54 55 56
57 58 59 60 61 62 63 64
 
樣例輸出
260
數據規模和約定
  棋盤上的數字範圍0~99
 

註釋:遞歸題。測試

棋盤: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 }            
相關文章
相關標籤/搜索