第1章 遊戲之樂 中國象棋將帥問題

2021-09-07 00:08:26 字數 1905 閱讀 3132

中國象棋裡面雙方的「將」和「帥」各自呆在自己的九宮格裡,一步只能橫移或縱移一格,而且雙方不能見面(既不能處在同一條縱線上)。在殘局時有的人會用這一規則走出絕妙殺招。假設一方的「將」為a,另一方的「帥」為b,現在求雙方所能出現的所有合法位置,所需變數只能用乙個位元組來儲存。

我們用1~9的數字來,按行優先的順序來表示每個格點的位置,如下圖所示。這樣只需要用模餘運算就可以得到當前的列號,從而判斷a、b是否互斥。

一種比較正經的解法,就是用位運算,設乙個char變數,前四個位元組存乙個變數,後四個位元組存乙個變數。

#include

#define half_bits_length 4 //

儲存單元長度的一半,即4位

#define fullmask 255 //

儲存單元全部bit的mask(掩碼),在二進位制表示中,是11111111

#define lmask (fullmask << half_bits_length) //

左四位,11110000

#define rmask (fullmask >> half_bits_length) //

右四位。00001111

#define rset(b,n) (b = ((lmask &b) | (n))) //

將b的右四位設定為n

#define lset(b,n) (b = ((rmask &b) | (n) << half_bits_length)) //

將b左四位設定為n

#define rget(b) (rmask&b) //

得到b右四位的值

#define lget(b) ((lmask&b) >> half_bits_length) //

得到b左四位的值

#define gridw 3 //

九宮格邊界長度

intmain()}}

return0;

}

package

chapter1youxizhilechinesechess;

/*** 【解法一】

* 中國象棋將帥問題

* @author

dell *

*/public

class

chinesechess1

public

static

int rset(byte b, int n)

public

static

int lget(byte b)

public

static

int rget(byte b)

public

static

final

int gridw = 3;

public

static

void

main(string args) }}

}

package

chapter1youxizhilechinesechess;

/*** 中國象棋將帥問題

* 【解法二】

* @author

dell *

*/public

class

chinesechess2

byte i = 1;

while(i!=80)}}

有人說是效率最高的:

//

中國象棋將帥問題

//【解法三】

#include struct

i;int

main()

}return0;

}

第1章 遊戲之樂 中國象棋將帥問題

中國象棋裡面雙方的 將 和 帥 各自呆在自己的九宮格裡,一步只能橫移或縱移一格,而且雙方不能見面 既不能處在同一條縱線上 在殘局時有的人會用這一規則走出絕妙殺招。假設一方的 將 為a,另一方的 帥 為b,現在求雙方所能出現的所有合法位置,所需變數只能用乙個位元組來儲存。我們用1 9的數字來,按行優先...

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

下過中國象棋的朋友都知道,雙方的 將 和 帥 相隔遙遠,並且不能照面。在象棋殘局中,許多高手能利用這一規則走出許多精妙的殺招。假設棋盤上只有 將 和 帥 二子。下面為了敘述方面,我們約定用a表示 將 b表示 帥 a和b分別被限制在自己的九宮格內,不能走出九宮格,不能走斜線,只能走橫豎線上的一步。請寫...

中國象棋將帥問題(一)

好的,言歸正傳,今天看了兩個問題,乙個是 讓cpu佔用率曲線聽你指揮 但是沒太明白,需要惡補作業系統的知識 乙個就是 中國象棋將帥問題 中國象棋將帥問題 主要說的就是在在象棋中的規則 兩個老頭不會面 列出所有的棋局可能。這個演算法並不複雜,但是問題來了,要求只用乙個位元組儲存變數 1byte 8bi...