中國象棋將帥問題(一)

2021-06-26 09:18:59 字數 1528 閱讀 7843

好的,言歸正傳,今天看了兩個問題,乙個是「讓cpu佔用率曲線聽你指揮」(但是沒太明白,需要惡補作業系統的知識),乙個就是「中國象棋將帥問題」。

「中國象棋將帥問題」主要說的就是在在象棋中的規則「兩個老頭不會面」,列出所有的棋局可能。這個演算法並不複雜,但是問題來了,要求只用乙個位元組儲存變數(1byte = 8bits),容易聯想到unsigned char型別。

好的,我們最重要的就是複習關於「&」、「|」這些運算子的知識了。(本科的時候不覺得二進位制的運算能在程式設計中有用,現在我們遇到了)。另外,還有位操作符「<>」。(真的太驚訝,從沒想過怎麼會用到位操作符程式設計?簡直好遙遠)。

下面給出自己的**(根據書上的**整理)來看看究竟有多麼awesome!

#include #define half_bits_length 4

#define fullmask 255 //很眼熟吧,這是8位二進位制,二進位制形式:1111 1111

#define gridw 3 //設定棋盤的將和帥可移動範圍的寬度

#define lmask (fullmask << half_bits_length) //左移4位可得到1111 0000,用其與別的數進行「與」,則得到前四位不變,後四位為0

#define rmask (fullmask >> half_bits_length) //右移4位可得到0000 1111,用其與別的數進行「與」,則得到後四位不變,前四位為0

#define lset(b,n) (b = ((rmask & b) | (n << half_bits_length))) //設定b的值,b的後四位不變,前四位置0,將n左移四位後和b做「或」運算,給b的前四位進行賦值(對於b的後四位沒有影響)

#define rset(b,n) (b = ((lmask & b) | n)) //類似的,b的前四位不變,後四位置0,和n作與運算,所得值賦給b

#define lget(b) ((lmask & b) >> half_bits_length) //「與」得到b的前四位,後四位是0,然後右移四位,得到b的真實值

#define rget(b) (rmask & b)//同樣的,但是後四位幸運得多,不需要移位,「與」過之後就得到所求值

#define area 9

void chess_1();//version 1 最普通的實現版本

void chess_2();//version 2 只使用乙個變數,完成整個程式設計,第一次見,簡直驚嘆!awesome

using namespace std;

int main()

void chess_1() }}

void chess_2()

chess_1則是最一般的版本,chess_2則是書上給出的**,值得學習的地方在注釋中已經標出來了,便於之後複習使用!至於之後的兩種解法,會在(二)中進行解釋。

今天還是有點小high的,哈哈

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

即將面臨找工作,最近在看 程式設計之美 這本書。自己能力有限所以覺得有些題目難度不小,但仍覺受益匪淺,有時間一定再讀幾遍。下面是關於 中國象棋將帥問題 的一些心得 書中給出的演算法的精妙之處這裡不再贅述,給出自己的想法 原理與書中給出演算法相同,通過迴圈實現。對其中的任意乙個位置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 由此...

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

程式設計之美1.2,題目不再重複了,這裡主要研究方法二。核心思想就是兩重迴圈分別從1到9,如果兩個變數處於同一直線則跳過,不然就列印出兩個變數。題目的要求在於只能用乙個位元組來儲存,所以就需要空間上進行巧妙的變換。兩個變數從1到9,其實只有9 9 81種狀態,理論上乙個位元組儲存已經綽綽有餘了。題中...