列表

详情


NC24223. Tic-Tac-Toe

描述


Alice和Bob正在下井字棋,顾名思义,在3*3棋盘上先完成三子连珠(横、竖,或者斜对角线)的玩家将获胜。
Alice执白子,Bob执黑子。
但是在下了几步后,Alice觉得这不好玩并失去了耐心,现在轮到他落子。他想知道他是否能在下一步立即获得游戏胜利。
本来这是个简单的判定,问题是Bob是很坏的,如果他发现Alice可以在下一步立即胜利,Bob会偷偷的偷走Alice一颗棋子而尽可能使得Alice不能立马赢得胜利。 给你当前的局况,你能帮助Alice弄清下一步能否获得胜利吗?

输入描述

有多组测试样例。
第一行一个整数--测试样例的个数。
接下来每三行表示一个样例,且每一行包含三个字符。
如果第行第个字符是'#'表示这个位置是空的还没有被落子,如果是'W'则代表该位置有一个白子,'B'则代表该位置有一个黑子。
保证输入不存在已完成的三子连珠,不保证黑子和白子的数目相等,不保证有可以落子的点,如果没有点可以落子则默认Alice不能在下一步立即获得游戏胜利。

输出描述

对每个样例输出一行。
如果Bob不偷走Alice的棋子Alice也不能在下一步立即获得游戏胜利,请输出"Bob"。
如果Bob需要偷走Alice的一颗棋子才能使Alice不能在下一步立即获得游戏胜利,请输出"Emmm"。
如果即使Bob偷走Alice的一颗棋子Alice也能在下一步立即获得游戏胜利,请输出"Alice"。

示例1

输入:

1
W#W
BWB
#B#

输出:

Alice

示例2

输入:

1
W##
BBW
BWB

输出:

Bob

示例3

输入:

1
W#W
B#B
#B#

输出:

Emmm

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++ 解法, 执行用时: 6ms, 内存消耗: 396K, 提交时间: 2022-06-26 22:46:21

#include<bits/stdc++.h>
using namespace std;
char s[15];
bool check(int x,int y,int z)
{
	int a=(s[x]=='W')+(s[y]=='W')+(s[z]=='W');
	int b=(s[x]=='#')+(s[y]=='#')+(s[z]=='#');
	return a==2&&b==1;
}
bool judge(){
	return check(1,2,3)||check(4,5,6)||check(7,8,9)||check(1,4,7)||check(2,5,8)||check(3,6,9)||check(1,5,9)||check(3,5,7);
}
void solve(){
	scanf("%s%s%s",s+1,s+4,s+7);
	if(judge()){
		for(int i=1;i<=9;i++){
			if(s[i]=='W'){
				s[i]='#';
				if(!judge()){
					printf("Emmm\n");
					return ;
				}
				s[i]='W';
			}
		}
		printf("Alice\n");
	}
	else printf("Bob\n");
}
int main(){
	int T;
	scanf("%d",&T);
	while(T--){
		solve();
	}
	return 0;
}

上一题