VJ传送门:https://vjudge.net/problem/CodeForces-754B
题意:4x4的棋盘,x和o谁先有三个连在一起(同一行,列,对角线)就算赢,现在在给定棋盘上的.处放下一个x,问能否使x获胜
思路:直接逻辑判断,注意要分放下的点位于三个连续x的边缘还是中间
ps:注意防止数组越界
代码:
#include<iostream>
using namespace std;
int main()
{
char a[4][4];
for(int i=0;i<4;++i)
for(int j=0;j<4;++j)
cin>>a[i][j];
for(int i=0;i<4;++i)
for(int j=0;j<4;++j){
if(a[i][j]=='.'){
if((i-2>=0&&j-2>=0&&a[i-2][j-2]=='x'&&a[i-1][j-1]=='x')||(i+2<4&&j+2<4&&a[i+2][j+2]=='x'&&a[i+1][j+1]=='x')||
(i-2>=0&&a[i-2][j]=='x'&&a[i-1][j]=='x')||(i+2<4&&a[i+2][j]=='x'&&a[i+1][j]=='x')||
(i+2<4&&a[i+2][j]=='x'&&a[i+1][j]=='x')||(j-2>=0&&a[i][j-2]=='x'&&a[i][j-1]=='x')||
(j+2<4&&a[i][j+2]=='x'&&a[i][j+1]=='x')||(i-2>=0&&j+2<4&&a[i-2][j+2]=='x'&&a[i-1][j+1]=='x')||
(i+2<4&&j-2>=0&&a[i+2][j-2]=='x'&&a[i+1][j-1]=='x')||
(i-1>=0&&j-1>=0&&i+1<4&&j+1<4&&a[i-1][j-1]=='x'&&a[i+1][j+1]=='x')||
(i-1>=0&&i+1<4&&a[i-1][j]=='x'&&a[i+1][j]=='x')||
(i-1>=0&&j-1>=0&&i+1<4&&j+1<4&&a[i-1][j+1]=='x'&&a[i+1][j-1]=='x')||
(j-1>=0&&j+1<4&&a[i][j-1]=='x'&&a[i][j+1]=='x')
){
cout<<"YES"<<endl;
return 0;
}
}
}
cout<<"NO"<<endl;
return 0;
}
从来没写过这么长的if......