1. 程式人生 > >《棋盤上的“馬步”探究》(三)

《棋盤上的“馬步”探究》(三)



0. 問題背景 (本課題為九年級組探究課題)


在中國象棋中,馬的走法是一直一斜,棋諺“馬走日字(本質上說,“馬走日字”是走1×矩形的對角線)。從棋盤上任意一點出發,馬能跳到任意的一個點。




4. 一個走“目”的“千里馬”在整幅棋盤上,能否從任意一點,跳到指定點?


分析與解答

如上圖所示,我們假設“千里馬”是一隻蟲子,每次走一個“目”字,都需要爬過4個格子,即從A向一個方向走3格,轉90°再走1格。這樣,從A出發的任何路徑上的每一個能走到的點,距離A的“距離”(即經過的格子數)都是4的倍數,即一個偶數。而從黑色格子(A)出發,終點為白色格子(B),必然需要經過奇數個格子。因此,走“目”字的千里馬,從A走到B是不可能的,並且這和棋盤的大小無關。


另一種解法

上述結論還有另一個解法,也比較容易理解。

如上圖所示,從一個黑色格子出發,下一步必然也在黑色格子中(即必然停留在同色格子內)。因此,無論如何都不可能從黑色格子走到白色格子,反之也一樣。


研究與拓展


那麼在10×9的整幅棋盤中,從任意一個位置出發,可以跳到的位置的範圍是如何的呢?下面我來證明在棋盤中,任意黑色的格子之間可以相互走到,白色的格子之間也可以相互走到。當然,前文已經證明了黑白之間是走不到的。


假設左上角的黑色格子為起點,我採用“寬度優先搜尋”的演算法思想來構造走法。圖中左上角標號為1,圖中任意標號為i(i > 1)的格子,必然可以找到一個標號為i -1 的格子,通過千里馬走到它。實際上標號就表示為從左上角出發,能到達這個格子的最短步數。也就是說,如果從左上角出發,任意黑色格子,最遠只需要跳5步(最大標號6減去1)即可到達。


那麼從左上角出發,到每一個黑色格子的路徑,最終形成了一個樹狀結構,根節點(出發點)即為左上角的格子。對於任意兩個黑色格子,只要從其中一個格子出發,先到達兩個黑色格子的公共祖先(共同擁有的上級祖先),當然這裡最遠可以回到起點,然後再沿路跳轉下去就可到達另一個黑色格子。即任意兩個黑色格子之間,都存在路徑可以到達。


用類似的方法,我們來構造白色格子間的樹形結構。



如上圖所示,以第一行第二列為起點,遍歷結構和前文的黑色格子完全相同。同樣方法可以證明,任意白色格子間也可以相互走到。


綜上所述,把每個格子看作一個節點,將兩兩之間能跳到的格子間連邊,通過這樣的建圖的方式,整幅10×9的棋盤的90個節點的圖,實際上被構造成了兩個互不聯通的圖。一個由所有黑色格子構成,另一個由白色格子構成,兩個圖中兩兩可達(即強連通),但兩個圖之間沒有任何交集。





…… 後續問題探究 


上文我首先證明了如果是“目”字跳躍的馬,是不可能遍歷整個棋盤的,和棋盤的大小無關。同時還構造出在整幅棋盤中,黑色格子和白色格子為起點的馬,採用“目”字跳躍的遍歷範圍,且最遠只要跳 5 次就可以了。


現在問題來了,馬的跳躍方法從“日”拓展到了到“目”,那麼如果是一個 1 x n 的“千里馬”呢?在一個無限大的棋盤裡,這個“千里馬”能從任意指定點出發,跳躍到另一個指定點麼?