在一个8*8的棋盘上放置八个皇后,每个皇后在其本身行、列、对角线上不能出现其它皇后。总共有92种放置情况。
用r表示行,用c[r]表示列,判断条件,因为r是不断增加的行,只会找没有皇后的行,所以无需判断行数,然后条件减少成三条:
判断列、判断主对角线、判断负对角线.。
1.c[r]==c[j] j在r之前循环
2.c[r]-c[j]==r-j;
3.c[j]-c[r]==r-j;
寻找函数,到8了退出,做个边界,到了回溯。
void search(int r){
if(r==8){
save();
return;
}
for(int i=0;i<8;i++){
c[r]=i;
bool ok=true;
for(int j=0;j<r;j++)
if(c[r]==c[j]||r-j==c[r]-c[j]||r-j==c[j]-c[r]){
ok=false;
break;
}
if(ok){
search(r+1);
ans=0;
}
}
}
保存函数,有了皇后坐标,双循环把价值加在ans里,最后比较一次最大值。
void save(){
for(int i=0;i<8;i++){
for(int j=0;j<8;j++){
if(j==c[i]){
ans+=a[i][j];
}
}
}
Ans=max(Ans,ans);
}
主函数,没啥好说的
int main(){
int k;cin>>k;
while(k--){
for(int i=0;i<8;i++){
for(int j=0;j<8;j++){
cin>>a[i][j];
}
}
Ans=0;ans=0;
search(0);
cout<<setw(5)<<Ans<<endl;
}
return 0;
}