1. 程式人生 > 實用技巧 >計蒜客:八皇后+最大和

計蒜客:八皇后+最大和

 1 #include <cstdio>
 2 #include <iostream>
 3 using namespace std;
 4 int n=0;//n皇后
 5 int ans=0;//解個數
 6 bool hashTable[20]={false};//列是否被佔有
 7 bool xy[20]={false};//左下-右上對角線佔有情況
 8 bool yx[20]={false};//左上-右下對角線佔有情況
 9 int val[100][100];//存放每個解的皇后行列號
10 int maze[100][100];
11 int P[20]={0};
12 void dfs(int deep){
13 if(deep>=n){ 14 ans++; 15 for(int i=0;i<n;i++){//每找到一個解,就填充val的一行 16 val[ans][i]=P[i];//val的每一行 填的是每個解的皇后的列號,而val行號是解的號碼,列號即是皇后在棋盤上的行號,
                    所填的值是皇后在棋盤上的列號,例:val[2][5]裡的值表示第二個解的第五行的皇后在棋盤的列號
17 } 18 } 19 for(int i=0;i<n;i++){//為每個行deep尋找合適的列
20 if(xy[i+deep]==false&&yx[i-deep+n]==false&&hashTable[i]==false){//與之前的皇后無衝突 21 xy[i+deep]=true; 22 yx[i-deep+n]=true; 23 hashTable[i]=true; 24 P[deep]=i; 25 dfs(deep+1);//繼續向下一行搜尋 26 hashTable[i]=false;//恢復狀態
27 yx[i-deep+n]=false; 28 xy[i+deep]=false; 29 } 30 } 31 } 32 int main(){ 33 n=8; 34 for(int i=0;i<n;i++){ 35 for(int j=0;j<n;j++){ 36 cin>>maze[i][j];//輸入棋盤 37 } 38 } 39 dfs(0);//尋找解並填充 40 int maxn=0; 41 for(int i=0;i<ans;i++){//遍歷所有解 42 int mmmaxn=0; 43 for(int j=0;j<n;j++){ 44 mmmaxn+=(maze[j][val[i][j]]);//把每個解的八個棋牌格的值加起來,val[i][j]是皇后所在棋盤的列號 45 } 46 maxn=max(maxn,mmmaxn);//尋找最大值 47 } 48 cout<<maxn<<endl;//輸出最大值 49 return 0; 50 }