在《程式設計之美:微軟技術面試心得》一書中,看到這樣一道"中國象棋將帥問題":
下過中國象棋的朋友都知道,雙方的"將"和"帥"相隔遙遠,並且它們不能照面。在象棋殘局中,許多高手能利用這一規則走出精妙的殺招。假設棋盤上中只有"將"和"帥"二子(如圖1所示,注:此圖僅作示意,原圖請見《程式設計之美:微軟技術面試心得》一書)(為了下面敘述方便,我們約定用a表示"將",b表示"帥")。
圖 1a、b二子被限制在已方3×3的格仔裡運動。例如,在如上的**裡,a被正方形包圍,而b被正方形包圍。每一步,a、b分別可以橫向或縱向移動一格,但不能沿對角線移動。另外,a不能面對b,也就是說,a和b不能處於同一縱向直線上(比如a在d10的位置,那麼b就不能在d1、d2以及d3的位置上)。
請寫出乙個程式,輸出a、b所有合法位置。要求在**中只能使用乙個變數。
(以上題目選自《程式設計之美:微軟技術面試心得》)
在原文中,作者給出了三種解法,都很精彩。主要有兩點需要注意的地方,乙個是如何簡單地表示每個格點的位置。在文中,採用了用1~9的數字按照行優先的順序進行表示(如圖2所示),這樣,只需要用模餘運算就可以得到當前格點列號,從而判斷a、b是否互斥。
圖 2 用1~9的數字表示a、b的座標
另乙個需要注意的地方是使用乙個變數同時儲存a、b兩個子的位置資訊。文中一種解法是乙個byte型別的值前後兩部分分別表示這兩個位置,並給出一系列在byte變數上進行運算的做法,在**中給出了不少相應的巨集定義,**量相對較多。而第二種解法的**則很簡單,不過其實現思路是怎樣的,文中並未直接給出,**如下:
byte i = 81;
while(i --)
}正如書中所言,"問題的本身並不複雜",其實,個人認為這幾種解法在本質上是一樣的(書中還有另一種解法),這裡只是給出一點小想法,如各位還有其他想法或發現文中的不足之處,歡迎分享交流。
中國象棋將帥問題(一)
好的,言歸正傳,今天看了兩個問題,乙個是 讓cpu佔用率曲線聽你指揮 但是沒太明白,需要惡補作業系統的知識 乙個就是 中國象棋將帥問題 中國象棋將帥問題 主要說的就是在在象棋中的規則 兩個老頭不會面 列出所有的棋局可能。這個演算法並不複雜,但是問題來了,要求只用乙個位元組儲存變數 1byte 8bi...
《程式設計之美》 中國象棋將帥問題
即將面臨找工作,最近在看 程式設計之美 這本書。自己能力有限所以覺得有些題目難度不小,但仍覺受益匪淺,有時間一定再讀幾遍。下面是關於 中國象棋將帥問題 的一些心得 書中給出的演算法的精妙之處這裡不再贅述,給出自己的想法 原理與書中給出演算法相同,通過迴圈實現。對其中的任意乙個位置k,其餘8個位置都可...
程式設計之美 中國象棋將帥問題
首先,我們歸納總結一下展開原理,對於 a b i 我們可以用如下公式展開 loop1 i b loop2 i b a 其中loop1是內層迴圈,loop2是外層迴圈 那麼如果 a 本身就是 k j 組成的呢?由於 k j i b 套用公式得到 loop1 i b j loop2 i b j k 由此...