八皇后——(第一场 递归与回溯)

在一个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;
}

猜你喜欢

转载自blog.csdn.net/iuk11/article/details/107589357