中國象棋裡面雙方的「將」和「帥」各自呆在自己的九宮格裡,一步只能橫移或縱移一格,而且雙方不能見面(既不能處在同一條縱線上)。在殘局時有的人會用這一規則走出絕妙殺招。假設一方的「將」為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;
}
packagechapter1youxizhilechinesechess;
/*** 【解法一】
* 中國象棋將帥問題
* @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...