The Sultan’s Successors UVA - 167
这里主要学习一下用行号和列号表示棋盘的左右对角线
#include <iostream>
#include <cstring>
#include <string>
#include <cstdio>
using namespace std;
int bord[10][10];
bool col[10],le[20],ri[20];
int maxsum;
void dfs(int r,int val)
{
if(r == 8){
maxsum = max(maxsum,val);
return ;
}
for(int i = 0; i < 8; i++){//第r行所对应的8列
//计算(r,c)点所在的左右对角线序号
int ld = i - r;
int rd = i + r;
if(!col[i]&&!le[ld]&&!ri[rd]){//该位置满足可以放皇后的条件
col[i] = 1,le[ld] = 1,ri[rd] = 1;
val += bord[r][i];
dfs(r + 1,val);
col[i] = 0,le[ld] = 0,ri[rd] = 0;
val -= bord[r][i];
}
}
}
int main()
{
int t;
scanf("%d",&t);
while(t--){
for(int i = 0; i < 8; i++){
for(int j = 0; j < 8; j++){
scanf("%d",&bord[i][j]);
}
}
int val = 0;
maxsum = 0;
dfs(0,val);//行号,防止皇后数,已放置皇后数对应值之和
printf("%5d\n",maxsum);
}
return 0;
}