“前天是兔,昨天是鹿,今天是你……” Kotomi 愉悦地在校园里散步。
Kotomi 忽然看到 Dr. Cat 和 Prof. Chi 正在激烈地施展嘴遁进行对决,好奇的 Kotomi 决定上前围观。
"4E", "7F", "6C", "杀", "闪", "雷击", "天命"……
Dr. Cat 和 Prof. Chi 的口中念念有词,呆呆地站在一旁的 Kotomi 完全无法将思维跟上两位大神的节奏。好不容易,Kotomi 才从一群围观群众中得知,原来他们在进行黑白棋对决。
黑白棋是一种群众喜闻乐见的棋类游戏,双方各执黑白一色棋子,在 8 * 8 的棋盘上进行比赛(棋盘初始布局如下图),双方轮流下子,黑棋先手。
每次行动,玩家可以选择在棋盘中任意的有效格子处下子。在落子后,会进行八个方向的翻转操作。
翻转操作的过程是这样的:以刚放下的那颗棋子为中心(简称为中心棋子),在上、下、左、右、左上、左下、右上、右下八个射线方向内,分别寻找一个离中心棋子最近的己方颜色的棋子(简称为外侧棋子)。如果某个方向不存在外侧棋子,或者中心棋子和外侧棋子之间存在空白格子,或者中心棋子和外侧棋子直接相邻,则该方向是无效的,需要跳过。
如果一个翻转方向是有效的,则对其执行翻转操作,将中心棋子和外侧棋子之间的所有棋子都变成己方颜色的棋子。
而所谓的有效格子,则表示该格子是一个空白格子,并且在该格子处下子,至少有一个方向能出现有效翻转。
由于 Dr. Cat 和 Prof. Chi 的脑补水平已经达到正常人的 6 倍,他们下棋完全不需要棋盘,仅仅用语言就能在脑中进行对决。而作为一般人的 Kotomi,根本搞不清他们的 N 步操作之后会变成什么样的局面。所以 Kotomi 请求你,勇敢的少年,快用你的程序创造奇迹吧!
一个整数 T,表示有多少组测试数据。
对于每组测试数据,第一行是一个整数 N (1 <= N <= 60),表示这局黑白棋当前已经下过了 N 步棋子。
接下来的 N 行,每一行给出一个数字 X (1 <= X <= 8) 和一个字符 Y ('A' <= Y <= 'H'),表示棋子落在的位置。这些棋子是按照从开局到结束的行动顺序依次给出的,数据保证所有操作都是合法操作,并且不存在某个人无法落子的情况。
对于每组测试数据,输出最终的棋盘局面。黑子由 ‘#’ 表示,白子由 ‘*’ 表示,空白的格子由 ‘.’ 表示。棋盘的格子之间由一个空格隔开,棋盘的行号和列号也要输出。具体细节请参照样例,注意不要有多余的空白和换行符。
2
2
5 F
4 F
6
5 F
4 F
3 E
6 F
5 G
3 F
A B C D E F G H 1 . . . . . . . . 2 . . . . . . . . 3 . . . . . . . . 4 . . . * * * . . 5 . . . # # # . . 6 . . . . . . . . 7 . . . . . . . . 8 . . . . . . . . A B C D E F G H 1 . . . . . . . . 2 . . . . . . . . 3 . . . . # * . . 4 . . . * # * . . 5 . . . # # * # . 6 . . . . . * . . 7 . . . . . . . .
8 . . . . . . . .
#include <stdio.h> #include <string.h> #include <assert.h> int dx[] = {-1, -1, -1, 0, 0, 1, 1, 1}; int dy[] = {-1, 0, 1, -1, 1, -1, 0, 1}; int g[10][10], n; int main() { int T; scanf("%d", &T); while(T--){ int i, j, k, t; memset(g, 0, sizeof(g)); g[4][5] = g[5][4] = 1; g[4][4] = g[5][5] = 2; scanf("%d", &n); for (i = 0; i < n; i++){ char str[10]; int x, y, tx, ty; scanf("%d%s", &x, str); y = *str - 'A' + 1; assert(1 <= x && x <= 8); assert(1 <= y && y <= 8); assert(g[x][y] == 0); g[x][y] = (i & 1) + 1; for (j = 0; j < 8; j++){ for (k = 1; k < 8; k++){ tx = x + dx[j] * k; ty = y + dy[j] * k; if (tx < 1 || ty < 1 || tx > 8 || ty > 8) break; if (g[tx][ty] == 0) break; if (g[tx][ty] == g[x][y]){ for (t = 1; t < k; t++){ tx = x + dx[j] * t; ty = y + dy[j] * t; g[tx][ty] = g[x][y]; } break; } } } } puts(" A B C D E F G H"); for (i = 1; i <= 8; i++){ printf("%d", i); for (j = 1; j <= 8; j++){ if (g[i][j] == 0) printf(" ."); if (g[i][j] == 1) printf(" #"); if (g[i][j] == 2) printf(" *"); } puts(""); } } return 0; }