/*
给定目标棋盘,目标棋子。
判断两步内能否必胜。
3重for 枚举第一步,敌手第一步,第二步。
*/
#include<iostream>
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
typedef long long ll;
char g[6][6],ox[2],s;
int check(char ss)
{
for(int i=1;i<=3;i++)
{
int c1=0,c2=0,c3=0,c4=0;;
for(int j=1;j<=3;j++)
{
if(g[i][j]==ss) c1++;
if(g[j][i]==ss) c2++;
}
if(g[i][i]==ss) c3++;
if(g[i][4-i]==ss) c4++;
if(c1==3||c2==3||c3==3||c4==3) return 1;
}
return 0;
}
int ck(int y,int x)
{
if(g[y][x]!='.') return 1;
return 0;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
for(int i=1;i<=3;i++)
for(int j=1;j<=3;j++)
{
char read[2];
scanf("%s",read);
g[i][j]=read[0];
}
scanf("%s",ox);
s=ox[0];
int ans=0;
char ns= (s=='o'?'x':'o');
for(int i=0;i<9;i++)
{
int y=i/3+1,x=i%3+1,f1=0,f2=0;
if(ck(y,x))
continue;
g[y][x]=s;
if(check(s))
{
ans=1;
break;
}
for(int j=0;j<9;j++)
{
int y=j/3+1,x=j%3+1;
if(ck(y,x))
continue;
g[y][x]=ns;
if(check(ns))
{
g[y][x]='.';
f1=100;
break;
}
f1++;
for(int k=0;k<9;k++)
{
int y=k/3+1,x=k%3+1;
if(ck(y,x)) continue;
g[y][x]=s;
if(check(s))
{
g[y][x]='.';
f2++;
break;
}
g[y][x]='.';
}
g[y][x]='.';
}
if(f1==f2&&f1!=0)
{
ans=1;
break;
}
g[y][x]='.';
}
if(ans) printf("Kim win!\n");
else printf("Cannot win!\n");
}
return 0;
}
fzu 2283 模拟
最新推荐文章于 2020-04-23 12:27:55 发布