《程式設計之美》讀書筆記 一 中國象棋將帥問題

2021-05-22 05:27:44 字數 1459 閱讀 3310

當看到這個解法的時候,我心裡有一些感慨。在前幾個月,我一直未msra面試沒通過而惱火。但看到這個解法之後,我覺得我確實還要再努力一些才行。短短幾 行,體現了簡約之美,僅看看這個就值回錢了(開玩笑)。雖然可能有牛人說這沒什麼了不起,但我覺得如果我在面試這個問題的時候能寫下這樣的**,我會很有 成就感。在大多數時候我們無需知道希爾排序的時間複雜度的一點幾次方是怎麼算出來的,也無需去證明乙個最優化問題是否滿足「擬陣」的條件,我們只需要在這 樣乙個「簡單」的問題上做得漂亮,就夠了。

回過頭來分析這個解法。「將」和「帥」各在自己的3*3的格仔間裡面走動,我們共需要驗證9*9=81種位置關係,這也是i=81的由來。此外我們要明白 i/9和i%9的含義。我們知道,整數i可以由部兩分組成,即var=(var/9)*9+var%9 ,其中var

問題是(1)我們如何用乙個列印出相同的結果?(2)如果是n重迴圈呢?

面對第乙個問題,實際上就是對原始的中國象棋將帥問題進行了乙個擴充套件,即在棋盤上新增乙個「王」,其行走規則和將帥 一樣。於是棋盤變成了三國爭霸:-) ,將帥王可以走動的格仔數分別為3、4、5,它們之間的互斥條件可以按需要設定。

這時,就需要只用乙個變數遍歷乙個三重迴圈。直觀的方法是像方法一那樣把乙個4位元組的int拆開來用。我這裡只關注方法二。

只用乙個變數解決擴充套件的中國象棋將帥問題,我們的**應該是如下的樣子:

在衝突條件中,我們需要知道var取得某個特定的值(即第var+1次迴圈)的時候的i,j,k分別是多少(這樣我們才能判定將帥位置是否衝突)

從上例的結果中我們可以看到,counter的值(即當前的迴圈次數)和三元組(i,j,k)是一一對應的,越是外層的迴圈變化越慢,他們滿足什麼關係 呢?

k的取值最好確定,我們都知道是var%3。

在原始的將帥問題中我們知道,j的值應該是 var/3,但是由於j上面還有一層迴圈,就需要做些調整,變成var/3%4

最外層迴圈i的值則為(var/(3*4))%5.

即:k=var%3 //其下沒有迴圈了

j=var/3 //其下有幾個迴圈長度為3的迴圈

i=var/(3*4). //其下有幾個迴圈長度為3*4的迴圈

於是4重迴圈的公式我們也可以輕鬆得出:

for( int i = 0; i < 5; i++ )

for( int j = 0; j < 4; j++ )

for( int k = 0; k < 3; k++ )

for( int p = 0; p < 2; p++ )

p=var%2 //其下沒有迴圈了

k=var/2 //其下有幾個迴圈長度為2的迴圈

j=var/(2*3)) //其下有幾個迴圈長度為2*3的迴圈

i=var/(2*3*4)//其下有幾個迴圈長度2*3*4的迴圈

n重迴圈原理也是一樣,就不再贅述了。

ps:看到最後一例的結果是不是與《演算法導論》中平攤分析一章的二進位制計數器很像?只不過這裡進製不一樣而已:-)

《程式設計之美》讀書筆記 一 中國象棋將帥問題

程式設計之美 讀書筆記 一 中國象棋將帥問題 千呼萬喚始出來,在跳票了快乙個月之後,雖然明知道書裡還有不少錯誤沒改過來 附了一整頁的勘誤 但是感覺已經不能等下一版了。趕快去書店買回來,吃完飯躺床上舒舒服服地看。大致翻看之後,總體感覺是書中的內容沒有 脫離群眾 很多都是我們平時生活 工作中經常能遇到的...

《程式設計之美》讀書筆記(一) 中國象棋將帥問題

千呼萬喚始出來,在跳票了快乙個月之後,雖然明知道書裡還有不少錯誤沒改過來 附了一整頁的勘誤 但是感覺已經不能等下一版了。趕快去書店買回來,吃完飯躺床上舒舒服服地看。大致翻看之後,總體感覺是書中的內容沒有 脫離群眾 很多都是我們平時生活 工作中經常能遇到的。題目不見得難,基本上給一本 演算法導論 和足...

程式設計之美讀書筆記 1 2 中國象棋將帥問題

中國象棋將帥問題 在一把象棋的殘局中,象棋雙方的將帥不可以相見,即不可以在中間沒有其他棋子的情況下在同一列出現。而將 帥各被限制在己方的3 3的格仔中運動。相信大家都非常熟悉象棋的玩法吧,這裡就不詳細說明遊戲規則了。用a b代表將和帥,請寫出乙個程式,輸出a b所有合法的位置。要求在 中只能用乙個變...