38行代码AC——UVA-167The Sultan‘s Successors(八皇后问题,附视频讲解)
生活随笔
收集整理的這篇文章主要介紹了
38行代码AC——UVA-167The Sultan‘s Successors(八皇后问题,附视频讲解)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
最近備考藍(lán)橋,學(xué)習(xí)到遞歸模塊,從最基本的八皇后及其變種開始刷起(如果可以穿越,我一定要抓到發(fā)明遞歸的那個人,然后把他干掉,造福后世的算法er,)。
題目大意
一個人,沒孩子,要在死前分割財產(chǎn),然后出了一個題,讓人們做,也就是八皇后,8 * 8 的棋盤,棋盤有64個值,不同的放置方案有不同的和,求最大的和就可得出答案。
心路歷程
讀懂題意后很容易看出來這是一道八皇后的變種題,因此做此題前一定要理解且背寫出八皇后代碼。這里附上n皇后原理的視頻講解——>傳送門
很快的敲出了八皇后的原碼,與八皇后相比,本題第一個改變是如何求出每次遞歸結(jié)束后的Max值,下面兩種方法都是可行的:要么列入?yún)?shù)遞歸, 要么在邊界條件里+循環(huán)計算。
下一步是如何判斷皇后之間是否產(chǎn)生沖突,不能用原八皇后的判定方法是因為這里需要計算Max值,因此定義數(shù)組vis,記錄列、主對角線和副對角線的訪問情況。
最后提交,AC,耗時3h左右。
代碼展示
#include<iostream> #include<cstdio> #include<cmath> #include<cstring> using namespace std; int C[50], tot = 0, n = 8, nc = 0; int vis[3][50]; //記錄 列,主對角(y-x), 副對角(y+x) 訪問情況 int board[8][8]; int max_score; void search(int cur) {nc++;if(cur==n) {int score=0; for(int i=0;i<8;i++) score+=board[i][C[i]];max_score=max(max_score, score);}else for(int i=0;i<n;i++) { //從第一列開始放皇后 if(vis[0][i] || vis[1][i-cur+n] || vis[2][i+cur]) //如果有沖突則結(jié)束 continue;C[cur]=i;vis[0][i]=vis[1][i-cur+n]=vis[2][i+cur]=1; //這個皇后填放成功,設(shè)置成有沖突 search(cur+1); //行數(shù)+1,填放下一個皇后 vis[0][i]=vis[1][i-cur+n]=vis[2][i+cur]=0; //填放完畢,沖突取消,(回溯) } } int main() {int k; scanf("%d", &k); while(k--) {for(int i=0;i<8;i++) for(int j=0;j<8;j++) cin>>board[i][j]; memset(vis, 0, sizeof(vis));max_score=0;search(0);printf("%5d\n", max_score);} return 0; }如果這篇文章對你產(chǎn)生了幫助,就請給博主一個小小的贊吧!大家的點贊是我創(chuàng)作的最大動力!
總結(jié)
以上是生活随笔為你收集整理的38行代码AC——UVA-167The Sultan‘s Successors(八皇后问题,附视频讲解)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 16行代码AC——紫书| 例题7-3 F
- 下一篇: 10行代码AC——UVA 11538-C