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 }