//题意, 给你一个目前的状态, 问一个人是否可以在两步之内获胜, (现在该他, 然后对手, 然后再是他).
直接模拟下棋判一下是否可以赢就是了. 即第一次下完了以后, 他是否还有两种赢的状态, 有就一定会赢, 否则就不能赢.(和CF一道模拟五子棋的有点像)
AC Code
/** @Cain*/
int n,k;
char a[5][5];
bool check(char x) //判断当前x棋子再棋盘中是否能赢.
{
if(x==a[1][1]&&a[1][1]==a[1][2]&&a[1][2]==a[1][3])return true;
if(x==a[2][1]&&a[2][1]==a[2][2]&&a[2][2]==a[2][3])return true;
if(x==a[3][1]&&a[3][1]==a[3][2]&&a[3][2]==a[3][3])return true;
if(x==a[1][1]&&a[1][1]==a[2][1]&&a[2][1]==a[3][1])return true;
if(x==a[1][2]&&a[1][2]==a[2][2]&&a[2][2]==a[3][2])return true;
if(x==a[1][3]&&a[1][3]==a[2][3]&&a[2][3]==a[3][3])return true;
if(x==a[1][1]&&a[1][1]==a[2][2]&&a[2][2]==a[3][3])return true;
if(x==a[1][3]&&a[1][3]==a[2][2]&&a[2][2]==a[3][1])return true;
return false;
}
bool Find2(char x)
{
int ans = 0;
for(int i=1;i<=3;i++){
for(int j=1;j<=3;j++){
if(a[i][j] == '.'){
a[i][j] = x;
if(check(x)) ans++;
a[i][j] = '.';
}
}
}
if(ans >= 2) return true;
return false;
}
bool Find1(char x)
{
for(int i=1;i<=3;i++){
for(int j=1;j<=3;j++){
if(a[i][j] == '.'){
a[i][j] = x;
if(check(x) || Find2(x))
return true;
a[i][j] = '.';
}
}
}
return false;
}
void solve()
{
char s[5];
for(int i=1;i<=3;i++){
for(int j=1;j<=3;j++){
scanf("%s",s);
a[i][j] = s[0];
}
}
char x,y;
scanf("%s",s);
x = s[0];
if(x == 'o')
y='x';
else
y = 'o';
if(check(y)) printf("Cannot win!\n"); //目前对手就可以赢.
if(check(x) || Find1(x)) //目前Kim就可以赢或者走一步会两步后可以赢.
printf("Kim win!\n");
else
printf("Cannot win!\n");
}
int main()
{
int t;
scanf("%d",&t);
while(t--){
solve();
}
}