链接:https://ac.nowcoder.com/acm/contest/847/B
来源:牛客网
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld
题目描述
Alice和Bob正在下井字棋,顾名思义,在3*3棋盘上先完成三子连珠(横、竖,或者斜对角线)的玩家将获胜。
Alice执白子,Bob执黑子。
但是在下了几步后,Alice觉得这不好玩并失去了耐心,现在轮到他落子。他想知道他是否能在下一步立即获得游戏胜利。
本来这是个简单的判定,问题是Bob是很坏的,如果他发现Alice可以在下一步立即胜利,Bob会偷偷的偷走Alice一颗棋子而尽可能使得Alice不能立马赢得胜利。 给你当前的局况,你能帮助Alice弄清下一步能否获得胜利吗?
输入描述:
有多组测试样例。
第一行一个整数 T(T≤12000)
--测试样例的个数。
接下来每三行表示一个样例,且每一行包含三个字符。
如果第 i行第 j个字符是'#'表示 (i,j)这个位置是空的还没有被落子,如果是'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
思路:暴力模拟
***了
#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;
}