题目链接
按行深搜,设定三个标记数组分别标记已被占用的列、主对角线和副对角线
分析可得行列号推导主对角线、副对角线下标方法
AC如下
#include<bits/stdc++.h>
using namespace std;
int amap[8][8], maxc = INT_MIN;
bool val[8], sla[15], sla2[15];
void dfs(int c, int cnt){
if(c == 8){
if(cnt > maxc)
maxc = cnt;
}
else{
for(int i = 0; i < 8; i++){
if(val[i] && sla[c - i + 7] && sla2[c + i]){
val[i] = false;
sla[c - i + 7] = false;
sla2[c + i] = false;
dfs(c + 1, cnt + amap[c][i]);
val[i] = true;
sla[c - i + 7] = true;
sla2[c + i] = true;
}
}
}
}
int main(){
memset(val, true, sizeof(val));
memset(sla, true, sizeof(sla));
memset(sla2, true, sizeof(sla2));
for(int i = 0; i < 8; i ++)
for(int j = 0; j < 8; j++)
scanf("%d", &amap[i][j]);
dfs(0, 0);
cout<<maxc<<endl;
return 0;
}