func_code_string: #include <bits/stdc++.h>   using namespace std;   const int mx[8] = {-1, 1, -1, 1, -2, 2, -2, 2};   const int my[8] = {-2, -2, 2, 2, -1, -1, 1, 1};   const int MAXN = 1100;   const int MAXM = 1100;   int N, M;   const int MAXV = MAXN * MAXM;   int V;   int source[2];   int target[2];   int dist[2][MAXV];   int nxt[2][MAXV];   int st_dist[2][2];   bool parity(int v) { return ((v / M) + (v % M)) & 1; }   bool one_move(int a, int b) {     int dx = abs(a / M - b / M);     int dy = abs(a % M - b % M);     return (dx == 1 && dy == 2) || (dx == 2 && dy == 1);   }   int main() {     ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0);     cin >> N >> M;     V = N * M;     {       int X0, Y0, X1, Y1;       cin >> X0 >> Y0 >> X1 >> Y1;       X0--, Y0--, X1--, Y1--;       source[0] = X0 * M + Y0;       source[1] = X1 * M + Y1;     }     target[0] = (N / 2 - 1) * M + (M / 2 - 1);     target[1] = (N / 2 + 1 - 1) * M + (M / 2 - 1);     for (int z = 0; z < 2; z++) {       for (int i = 0; i < V; i++) dist[z][i] = -1;       queue<int> q;       dist[z][target[z]] = 0;       q.push(target[z]);       while (!q.empty()) {         int cur = q.front();         q.pop();         int x = cur / M, y = cur % M;         for (int d = 0; d < 8; d++) {           int nx = x + mx[d], ny = y + my[d];           if (0 <= nx && nx < N && 0 <= ny && ny < M) {             int n = nx * M + ny;             if (dist[z][n] == -1) {               dist[z][n] = dist[z][cur] + 1;               nxt[z][n] = cur;               q.push(n);             }           }         }       }       for (int x = 0; x < 2; x++) {         st_dist[x][z] = dist[z][source[x]];       }     }     int adv;     if (parity(source[0]) != parity(source[1])) {       adv = 0;     } else {       adv = 1;     }     int dis_dist = st_dist[!adv][!adv];     int adv_turns = (adv == 0) ? dis_dist : dis_dist - 1;     int me, goal;     if (st_dist[adv][adv] <= adv_turns) {       me = adv;       goal = adv;     } else if (st_dist[adv][!adv] - 1 <= adv_turns) {       me = adv;       goal = !adv;     } else {       me = !adv;       goal = !adv;     }     nxt[0][target[0]] = target[0] + 2 * M + 1;     nxt[1][target[1]] = target[1] - 2 * M + 1;     cout << (me == 0 ?  WHITE  :  BLACK ) <<   n  << flush;     int cur[2] = {source[0], source[1]};     for (int t = 0; true; t++) {       if (t % 2 == me) {         auto print_pos = [&]() {           cout << (cur[me] / M + 1) <<     << (cur[me] % M + 1) <<   n  << flush;         };         if (one_move(cur[me], cur[!me])) {           cur[me] = cur[!me];           print_pos();           exit(0);         }         if (cur[me] == target[goal]) goal = me;         cur[me] = nxt[goal][cur[me]];         print_pos();         if (cur[me] == target[me]) {           exit(0);         }       } else {         int x, y;         cin >> x >> y;         if (x == -1 && y == -1) {           exit(0);         }         x--, y--;         cur[!me] = x * M + y;       }     }     return 0;   }   