※ 引述《SocketAM2 (AM2)》之銘言:
: 根據經驗(在python上做profile分析)
: 一個AI要算得快,很重要的是比較兩個四位數字結果的這個function
: 不出意料的話很容易在這裡花上超過90%的計算時間
: 如果發現自己設計的AI算得太慢 (尤其是隨機算法要跑很多圈算平均)
: 建議把這個function做成查表
: 由於每次比較的結果只有0A0B~4A0B共14種 (沒有3A1B!!!)
: 在建立查表的時候建議把n1A, n2B存成:
: if (input1 != input2) table[input1][input2] = n1 * 5 + n2;
: else table[input1][input2] = 14;
: 這樣可以把所有組合簡單又不重複的壓在0~15 (其中兩個沒用到)
: 存表格只需要4 bit
如果你要四位比對這件事很快的話...
struct PermType {
char Permutation[24][4];
};
struct PermType* getPerm(char comp[4]) {
struct PermType *result
= (struct PermType)malloc(sizeof(struct PermType));
result.Permutation[0][0] = -1;
result.Permutation[0][1] = -1;
result.Permutation[0][2] = -1;
result.Permutation[0][3] = -1;
result.Permutation[1][0] = -1; //手填24x4異位組合:
result.Permutation[1][1] = -1; //無異位的填界外值,
result.Permutation[1][2] = comp[3]; //異位的填原值.
result.Permutation[1][3] = comp[2];
......
return result;
}
char comp[4], guess[4];
struct PermType *db;
genCode(comp);
db = getPerm(comp);
GameOver = false;
while (!GameOver) {
readGuess(guess);
a = countA(guess);
b = 0;
if (a == 4)
GameOver = true;
elseif (a < 3) {
b = countB(guess);
std::cout << a << 'A' << b << 'B' << std::endl;
}
}
int countA(char guess[4]) {
int i, result = 0;
for (i=0; i<4; i++)
if (comp[i] = guess[i])
result++;
return 0;
}
int countB(char guess[4]) {
int i, j, maxCount = 0;
int result;
for (i=0; i<24; i++) {
result = 0;
for (j=0; j<4; j++)
if (db->Permutation[i][j] = guess[j])
result++;
if (result > maxCount)
maxCount = result;
}
return maxCount;
}
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 118.167.46.140