还没睡醒,来集训队都迟到了,迷迷糊糊过的题,CF日常卡评测机,而且这题样例贼多,估计是因为都是“YES”,“NO”的输出怕概率过题吧,哈哈,虽然是一道水题,但也写个博客醒醒脑。
题意:五子棋嘛,大家都玩过,10*10的棋盘,问现在的棋局,Alice是否能一局获胜。
思路:八个方向,暴力枚举每个” . “,对于点的每两个相对方向,如果” X “的个数加起来>=4,那么就可以一局获胜。
#include<bits/stdc++.h>
#define maxn 15
#define inf 0x3f3f3f3f
typedef long long ll;
using namespace std;
char a[maxn][maxn];
int tx[]={-1,0,1,-1},ty[]={-1,-1,-1,0};
int ans;
int dfs(int i,int j,int dx,int dy)
{
int x=i+dx,y=j+dy;
if(a[i][j]=='X')
ans++;
else return ans;
if(a[x][y]=='X'&&x>=0&&x<10&&y>=0&&y<10){
dfs(x,y,dx,dy);
}
}
int main()
{
int sum=0;
for(int i=0;i<10;i++) cin>>a[i];
for(int i=0;i<10;i++){
for(int j=0;j<10;j++){
if(a[i][j]=='.'){
for(int k=0;k<4;k++){
ans=0;
sum=0;
int d1=i+tx[k],d2=j+ty[k];
int d3=i-tx[k],d4=j-ty[k];
if(d1>=0&&d1<10&&d2>=0&&d2<=10) dfs(d1,d2,tx[k],ty[k]);
sum+=ans;
ans=0;
if(d3>=0&&d4<10&&d3>=0&&d4<=10) dfs(d3,d4,0-tx[k],0-ty[k]);
sum+=ans;
if(sum>=4){ cout<<"YES"<<endl; return 0;}
}
}
}
}
cout<<"NO"<<endl;
return 0;
}