fzu 2283 模拟

/*
给定目标棋盘,目标棋子。 
判断两步内能否必胜。 
 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;
} 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值