看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《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