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

2022-03-05 18:14:11 字數 880 閱讀 2310

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

剛看到題時,首先想到的是除法計算除數的商和餘數(eax和edx)。後來才想到c/c++中需要動態多維陣列時,new一維陣列來模擬多維陣列時所進行的多維陣列的下標和實際偏移量的轉換,我想很多人學習c或c++時都做過這種事吧。

本以為題目要求輸出將帥在棋盤上的具體位置,如d10、f1,但書中的解法給的是相對位置,解決起來更簡單。解法一用了一堆令人討厭的巨集,**實在不美,解法三和解法一本質是一樣的,雖然解法三隻定義了乙個結構體,但結構體內有兩個變數,總共有三個變數,不合題意才對。

要將乙個變數i拆成兩個,可以根據它的二進位制表示分別取出連續幾位,比如第0-3位和第4-7位,讀變數時,取出變數i相應的幾位,存變數時,再更新變數i的對應幾位。另外,利用位置的對稱性,可以一次輸出兩個,減少迴圈次數。

下面的**和解法一類似,但是一次輸出兩個,減少了迴圈次數,並且沒有用到除法,如果不考慮c++ io效率的影響,會比解法二和解法三都高效。

//外層迴圈變數b使用i的第4-7位,初始值為1,最大值為8。

//內層迴圈變數a使用i的第0-3位,初始值為b+1,最大值為9。

for (unsigned i = 0x10; i < 0x90; i += 0x10)

for (i= (i & 0xf0) | (i >> 4); (++i & 0xf) < 10; )

if (((i & 0xf) - (i >> 4)) != 3 && ((i & 0xf) - (i >> 4)) != 6)

std::cout << "a=" << (i >> 4) << ", b="<< (i & 0xf) << "\n"

<< "a=" << (i & 0xf) << ", b="<< (i >> 4) << "\n";

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

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

《程式設計之美》讀書筆記

程式設計之美 讀書筆記 一 中國象棋將帥問題 程式設計之美 讀書筆記 二 求二進位制數中1的個數 擴充套件問題 程式設計之美 讀書筆記 三 一摞烙餅的排序問題 程式設計之美 讀書筆記 四 買書折扣問題的貪心解法 程式設計之美 讀書筆記 五 飲料 問題 程式設計之美 讀書筆記 六 連連看遊戲設計 程式...

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

當看到這個解法的時候,我心裡有一些感慨。在前幾個月,我一直未msra面試沒通過而惱火。但看到這個解法之後,我覺得我確實還要再努力一些才行。短短幾 行,體現了簡約之美,僅看看這個就值回錢了 開玩笑 雖然可能有牛人說這沒什麼了不起,但我覺得如果我在面試這個問題的時候能寫下這樣的 我會很有 成就感。在大多...