【蓝桥杯】8皇后·改
生活随笔
收集整理的這篇文章主要介紹了
【蓝桥杯】8皇后·改
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
參考博客:http://www.cnblogs.com/gaoteng/archive/2012/04/11/2442692.html
題目鏈接:http://lx.lanqiao.cn/problem.page?gpid=T374
9 10 11 12 13 14 15 16
17 18 19 20 21 22 23 24
25 26 27 28 29 30 31 32
33 34 35 36 37 38 39 40
41 42 43 44 45 46 47 48
48 50 51 52 53 54 55 56
57 58 59 60 61 62 63 64 樣例輸出 260 數據規模和約定 棋盤上的數字范圍0~99
思考:解答本題首先得了解什么是8皇后(為此我百度了一下)。 8皇后:八皇后問題是一個以國際象棋為背景的問題,如何能夠在 8×8 的國際象棋棋盤上放置八個皇后,使得任何一個皇后都無法直接吃掉其他的皇后?為了達到此目的,任兩個皇后都不能處于同一條橫行、縱行或斜線上。 所以首先要做的就是先解決8皇后問題,即是8個皇后共有多少種不同的放法,解決此問題后,再在定義一個8*8的數組,將數據存起來然后比大小即可。 然后思考如何處理8皇后問題:第一行有8種放法,而每一種放法下一行又對應了8種放法(當然這里先不考慮此問題的規則)…… 那么層層放下去就會得到一個滿8叉樹,那么此問題就可以用樹形的思想去解決,用深度優先遞歸算法來對每一層進行遍歷(這時候按照規則排除不滿足的情況)。 那么接下來思考如何找出不滿足的情況: 問題要求8個皇后不能同時位于同列、同行、同斜線。這里我定義x數組,下標i表示行,值x[i] 表示在皇后放在 i 行所在的那一列,那么只要每一個皇后所處的 i 和 x[i],不同即可滿足不同行、不同列。至于同斜線,觀察可知位于同一斜線的兩個位置如i 行 j行?滿足等式abs(i-j) == abs(x[i] - x[j] )。故次8皇后的 問題可以解決了。 然后在每一個位置上放一個數比較相加即可,但是需要注意的一點是在每一下一次遞歸結束后應該把遞歸之前加的那個數減去然后在進行下一次遞歸。
代碼:#include<cstdio> #include<iostream> #include<cmath> #define M 8+1using namespace std; int x[M]; //下標表示皇后所在的行,x[i]表示皇后所在的列 int sum,maxNum; int ar[9][9]; //代表每個點的數值 int max(int n1, int n2){if(n1>n2) return n1;return n2; }bool isPlace(int k){//不能是同行或者同列 或者同對角線 for(int i=1; i<k; ++i){if(abs(i-k) == abs(x[k]-x[i]) || abs( x[i] == x[k] ) )return false;}return true; } void onTrace(int t){if(t>8){maxNum = max(maxNum, sum);}else{for(int i=1; i<=8; ++i){ //colx[t]=i;if(isPlace(t)){sum+=ar[t][i];onTrace(t+1);//遞歸完之后就會進行下一列遞歸,所以應該把前一列的那個數去掉 sum-=ar[t][i]; //important!! here, error more than once}}}} int main() {for(int i=1; i<=8; ++i){for(int j=1; j<= 8; ++j){scanf("%d", &ar[i][j]);}}maxNum=-1;onTrace(1); //printf("%d\n", maxNum);return 0; }
總結
以上是生活随笔為你收集整理的【蓝桥杯】8皇后·改的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【蓝桥杯】周期字串
- 下一篇: Java基础篇(05):函数式编程概念和