题目描述
ACM-ICPC程序设计方法与实践这门课就要结束了,然而还有很多人都没有机会写一个简单的五子棋对战AI
所以这题就是要你写一个五子棋的对战AI
不过由于五子棋本身没有一个标准解,难以评判对错
所以这题只需要你解决五子棋中最简单的一个问题,若当前轮到你落子,你需要判断你是否能够在这次落子后赢得这场比赛
输入格式
第一行一个整数T(T<100)代表有T组数据
每组数据第一行两个整数n,c(0<n<20),棋盘大小为n*n,若c为1则你是黑子,若c为2则你是白子
接下来n行每行一个长度为n的由012构成的字符串,0代表尚未落子,1代表黑子,2代表白子
数据保证当前棋盘上不存在超过四个同色棋子连线的情况
输出格式
对于每组数据,若你能在这次落子后赢得比赛则输出"YES",否则输出"NO"
输入样例
2
5 1
11110
22220
00000
00000
00000
5 1
11112
22200
00000
00000
00000
输出样例
YES
NO
AC代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<bits/stdc++.h>
#include<stack>
#include<vector>
#include<cctype>
using namespace std;
int a[20][20];
int flag=1;
int judge(int n,int i,int j,int x,int f)
{
int t=a[i][j];
if(x==0)
{
cout<<"YES"<<endl;
flag=2;
return 0;
}
if(t==a[i+1][j]&&(f==0||f==1))
judge(n,i+1,j,x-1,1);
if(t==a[i+1][j+1]&&(f==0||f==2))
judge(n,i+1,j+1,x-1,2);
if(t==a[i+1][j-1]&&(f==0||f==3))
judge(n,i+1,j-1,x-1,3);
if(t==a[i][j+1]&&(f==0||f==4))
judge(n,i,j+1,x-1,4);
if(t==a[i][j-1]&&(f==0||f==5))
judge(n,i,j-1,x-1,5);
if(t==a[i-1][j]&&(f==0||f==6))
judge(n,i-1,j,x-1,6);
if(t==a[i-1][j+1]&&(f==0||f==7))
judge(n,i-1,j+1,x-1,7);
if(t==a[i-1][j-1]&&(f==0||f==8))
judge(n,i-1,j-1,x-1,8);
return 0;
}
int prejudge(int n,int c)
{
int t;
flag=1;
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
t=a[i][j];
if(t)
continue;
a[i][j]=c;
for(int u=0;u<n;u++)
{
for(int v=0;v<n;v++)
{
if(a[u][v]==c)
int f=judge(n,u,v,4,0);
else continue;
if(flag==2)
break;
}
if(flag==2)
break;
}
a[i][j]=t;
}
if(flag==2)
{
flag=0;
break;
}
}
if(flag)
cout<<"NO"<<endl;
return 0;
}
int main()
{
int t;
cin>>t;
for(int i=0;i<t;i++)
{
int n,c;
cin>>n>>c;
for(int j=0;j<n;j++)
{
long long int t;
cin>>t;
for(int k=0;k<n;k++)
{
long long int p=pow(10,n-k-1);
a[j][k]=t/p;
t=t%p;
}
}
if(n<5)
{
cout<<"NO"<<endl;
continue;
}
prejudge(n,c);
}
return 0;
}