#include #include #include #include using namespace std; typedef long double ld; int board[529]; struct player { ld q[7]; ld delta[125]; int score; void setDelta() { for(int k=0; k<125; k++) delta[k] = 0; delta[4] = 10000; delta[20] = 1; delta[3] = q[0]; delta[15] = q[4]; delta[2] = delta[3] * q[1]; delta[10] = delta[15] * q[5]; delta[1] = delta[2] * q[2]; delta[5] = delta[10] * q[6]; delta[0] = (delta[1]+delta[5]) * q[3]; } void revRole() { swap(delta[1], delta[5]); swap(delta[2], delta[10]); swap(delta[3], delta[15]); swap(delta[4], delta[20]); } ld deltaAt(int pos) { ld r = 0; int p[4] = {1,22,23,24}; for(int k=0; k<4; k++) { int P = p[k]; int v = board[pos-4*P] + board[pos-3*P] + board[pos-2*P] + board[pos-P]; r += delta[v]; v += board[pos+ P] - board[pos-4*P]; r += delta[v]; v += board[pos+2*P] - board[pos-3*P]; r += delta[v]; v += board[pos+3*P] - board[pos-2*P]; r += delta[v]; v += board[pos+4*P] - board[pos-1*P]; r += delta[v]; } return r; } int bm; ld max() { int qbm = 0; ld res = -1; for(int k=0; k<529; k++) if(board[k] == 0) { ld d = deltaAt(k); if(d >= res) { if(d > res) {qbm = 0; res = d;} qbm++; if(rand() % qbm == 0) bm = k; } } return res; } }; void clearBoard() { for(int y=1; y<=15; y++) for(int x=1; x<=15; x++) board[(3+x)+23*(3+y)] = 0; } ld bestq[7] = {0.3355044,0.1991849,0.3135847,0.1029193,0.1890494,0.1967362,0.1022812}; int main() { srand(time(NULL)); for(int pos=0; pos<529; pos++) board[pos] = 25; clearBoard(); int first; int left; player P; for(int k=0; k<7; k++) P.q[k] = bestq[k]; P.setDelta(); scanf("%d%d", &first, &left); if(first) goto move; while(true) { int ex, ey; scanf("%d%d%d", &ex, &ey, &left); board[(3+ex)+23*(3+ey)] = 5; move: P.max(); board[P.bm] = 1; printf("%d %d\n", (P.bm%23)-3, (P.bm/23)-3); fflush(stdout); } }