黑白棋

Time Limit: 2 Seconds       Memory Limit: 65536 KB

“前天是兔,昨天是鹿,今天是你……” 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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值