#include #include #include using namespace std; int n, m, p; struct board_t { int board[7][7][7]; int height[7][7]; bool operator < (const board_t &another); }; bool operator < (const board_t &b1, const board_t &b2) { for (int z = 0; z < n; z++) { for (int y = 0; y < n; y++) { for (int x = 0; x < n; x++) { if (b1.board[x][y][z] < b2.board[x][y][z]) { return true; } } } } return false; } board_t initial; int win_black, move_black; int win_white, move_white; int inner(int x, int y, int z) { if (x < 0 || y < 0 || z < 0 || x >= n || y >= n || z >= n) { return 0; } return 1; } void print(const board_t &b) { for (int z = 0; z < n; z++) { for (int y = 0; y < n; y++) { for (int x = 0; x < n; x++) { if (b.board[x][y][z] < 0) { printf(" -"); } else { printf(" %d", b.board[x][y][z]); } } printf("\n"); } printf("\n"); } printf("\n"); } int place(int x, int y, int player, board_t &b) { b.board[x][y][b.height[x][y]] = player; b.height[x][y]++; } int displace(int x, int y, board_t &b) { b.height[x][y]--; b.board[x][y][b.height[x][y]] = -1; } int check(int x, int y, int z, const board_t &b) { int dx, dy, dz, i, found; for (dz = 0; dz <= 1; dz++) { for (dy = ((dz==0)?0:-1); dy <= 1; dy++) { for (dx = ((dz==0&&dy==0)?0:-1); dx <= 1; dx++) { if (dx == 0 && dy == 0 && dz == 0) { continue; } if (b.board[x][y][z] <= -1) { continue; } if (!inner(x+dx*(m-1), y+dy*(m-1), z+dz*(m-1))) { continue; } found = 1; for (i = 1; i < m; i++) { if (b.board[x+dx*i][y+dy*i][z+dz*i] != b.board[x][y][z]) { found = 0; break; } } if (found) { return b.board[x][y][z]; } } } } return -1; } int check_all(const board_t &b) { int x, y, z, result; for (x = 0; x < n; x++) { for (y = 0; y < n; y++) { for (z = 0; z < n; z++) { if ((result = check(x, y, z, b)) >= 0) { return result; } } } } return -1; } void bfs() { int result; set *curr = new set(); set *prev = new set(); set *temp; prev->insert(initial); for (int move = p; ; move++) { if (prev->empty()) { return; } for (set::iterator i = prev->begin(); i != prev->end(); i++) { if ((result = check_all(*i)) >= 0) { if (result == 0) { win_black = 1; if (move_black > move) { move_black = move; } } if (result == 1) { win_white = 1; if (move_white > move) { move_white = move; } } } if (win_black && win_white) { delete curr; delete prev; return; } board_t newboard = *i; for (int y = 0; y < n; y++) { for (int x = 0; x < n; x++) { if (i->height[x][y] < n) { place(x, y, move%2, newboard); curr->insert(newboard); displace(x, y, newboard); } } } } temp = prev; prev = curr; curr = temp; curr->clear(); } } int main() { int i, j, k; int x, y, z, result; while (1) { scanf("%d%d%d", &n, &m, &p); if (m == 0 && n == 0 && p == 0) { break; } for (i = 0; i < 7; i++) { for (j = 0; j < 7; j++) { for (k = 0; k < 7; k++) { initial.board[i][j][k] = -1; } initial.height[i][j] = 0; } } win_black = win_white = 0; move_black = move_white = INT_MAX; for (int move = 1; move <= p; move++) { scanf("%d%d", &x, &y); place(x-1, y-1, (move-1)%2, initial); if (!win_black && !win_white && (result = check_all(initial)) >= 0) { if (result == 0) { win_black = 1; if (move_black > move) { move_black = move; } } if (result == 1) { win_white = 1; if (move_white > move) { move_white = move; } } } } if (!win_black && !win_white) { bfs(); } if ((win_black && win_white) || (!win_black && !win_white)) { printf("Draw\n"); } else if (win_black) { printf("Black %d\n", move_black); } else if (win_white) { printf("White %d\n", move_white); } } return 0; }