程式設計之美 1 2中國象棋的將帥問題

2021-06-28 06:21:49 字數 809 閱讀 3873

引子問題:

中國象棋將帥問題:

在一把象棋的殘局中,象棋雙方的將帥不可以相見,即不可以在中間沒有其他棋子的情況下在同一列出現。而將、帥各被限制在己方的3*3的格仔中運動。相信大家都非常熟悉象棋的玩法吧,這裡就不詳細說明遊戲規則了。

用a、b代表將和帥,請寫出乙個程式,輸出a、b所有合法的位置。要求在**中只能用乙個變數。

分析與解法:

這個問題的解法並不複雜。

遍歷a的所有位置

遍歷b的所有位置

如果a的位置和b的位置在同一列

輸出結果

否則 繼續尋找

地圖可以用0-8表示a或b可能的9個位置

0------1------2

3------4------5

6------7------8

關鍵問題在於只使用乙個變數來表示a和b的位置。所以可以使用位運算來解決。

位運算確實是乙個思路,可以節省空間,在很多時候,我們想表達的變數可能就是只有乙個很小的範圍,我們大可不必用乙個int或char去表示。

但是這裡想關注的不是位運算,而是下面一種解法:

int var = 81;

while( var-- )

開始看的一下也是沒看明白,後來才發現,乙個常數c,可以表示成c=c/9*9+%9,所以實際上上面**的var/9就可以當成內層迴圈,而var%9就可以當成外層迴圈,因為var的最大值是81,所以迴圈的範圍就在0~8之間進行,然後我們在列印的時候就只需要在額外加上1即可。確實很巧妙。

《程式設計之美》 1 2 中國象棋將帥問題

下過中國象棋的朋友都知道。雙方的 將 和 帥 相隔遙遠,並且不能照面。在象棋殘局中,許多高手座利用這一規則走出精妙的殺招。假設棋盤上只有 將 和 帥 二子 為了下面敘述方便,我們約定用a 表示 將 b表示 帥 a b二子被限制在己方3x3 的格仔裡運動。每一步,a b分別可以橫向或縱向移 動一格。但...

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

問題 現在有乙個象棋殘局,只剩下將a帥b,ab只能在3x3的格仔裡橫縱移動,而且ab不能照面。輸出a b的合法位置 要求 中只使用乙個變數 問題本身很簡單,難度在於只用乙個變數。解法一 位向量法,利用乙個8位byte儲存a b的位置,利用巨集抽象出對byte的操作 對l段賦值 對r段賦值 從byte...

1 2中國象棋將帥問題

include include 包含byte include using namespace std define half bit length 4 define fullmask 255 define lmask fullmask half bit length define rmask ful...