C語言討論象棋將帥問題,編程之美無處不在,巧妙解法值得一閱

C語言討論象棋將帥問題,編程之美無處不在,巧妙解法值得一閱

問題描述

C語言討論象棋將帥問題,編程之美無處不在,巧妙解法值得一閱

完整代碼,以及更多學習資料,私信“代碼“獲取

關於中國象棋將帥位置的簡單問題,如下圖所示,寫一個程序輸出將、帥的合法位置。

C語言討論象棋將帥問題,編程之美無處不在,巧妙解法值得一閱

完整代碼,以及更多學習資料,私信“代碼“獲取

分析與解法

問題的本身並不複雜,只要把所有A、B 互相排斥的條件列舉出來就可以完成本題的要 求。由於本題要求只能使用一個變量,所以必須首先想清楚在寫代碼的時候,有哪些信息需 要存儲,並且儘量高效率地存儲信息。稍微思考一下,可以知道這個程序的大體框架是:

C語言討論象棋將帥問題,編程之美無處不在,巧妙解法值得一閱

完整代碼,以及更多學習資料,私信“代碼“獲取

因此,需要存儲的是A、B 的位置信息,並且每次循環都要更新。為了能夠進行判斷, 首先需要創建一個邏輯的座標系統,以便檢測 A 何時會面對 B。這裡我們想到的方法是用 1~9的數字,按照行優先的順序來表示每個格點的位置。這樣,只需要用 模餘運算就可以得到當前的列號,從而判斷A、B 是否互斥。

C語言討論象棋將帥問題,編程之美無處不在,巧妙解法值得一閱

完整代碼,以及更多學習資料,私信“代碼“獲取

若題目要求只用一個變量,但是我們卻要存儲 A 和 B 兩個子的位置信息,該怎麼辦呢?

可以先把已知變量類型列舉一下,然後做些分析。 對於bool類型,估計沒有辦法做任何擴展了,因為它只能表示true和false 兩個值;而 byte 或者 int 類型,它們能夠表達的信息則更多。事實上,對本題來說,每個子都只需要 9 個數字就可以表達它的全部位置。

一個8位的byte類型能夠表達28=256個值,所以用它來表示A、B的位置信息綽綽有餘, 因此可以把這個字節的變量(設為b)分成兩部分。用前面的4 bit表示A的位置,用後面的 4 bit表示B的位置,那麼4個bit可以表示16個數,這已經足夠了。

那麼:如何使用bit級的運算將數據從這一byte變量的左邊和右邊分別存入和讀出呢?

大家容易想到的是對那個變量進行各種位運算,最後輸出結果。但是其實C語言中還提供了一種存在於結構體中叫做位域的類型,因此程序就變得簡單多了。

代碼實現

C語言討論象棋將帥問題,編程之美無處不在,巧妙解法值得一閱

編程之美,巧妙解法

C語言討論象棋將帥問題,編程之美無處不在,巧妙解法值得一閱

完整代碼,以及更多學習資料,私信“代碼“獲取

C語言討論象棋將帥問題,編程之美無處不在,巧妙解法值得一閱

更多精彩:


分享到:


相關文章: