我比较菜,赛时没写出来,但赛后,看了一些代码,人工列举了很多棋谱,发现了很多规律
做法开个数组统计行列的X棋子数量,同行行列有O让数量为负,代表无法连成三个
-
很显然,如果只下了1或者2步棋,必胜
-
如果只下了3步棋,那么输的情况只有类似于
-
空了一行或一列,且其他行如一下排列的棋局 (样例给的不错
OXX , OXO
XOO , XOX
GGG , GGG
只要确保某行某列某斜线棋子数量一定是2就行
-
如果空的是斜线,那么分为两种情况
-
X在另一个斜线上,且周边没有X,不赢
GOX
XGO
OXG
-
X在另一个斜线上,周边有X,必赢 还是一个道理只要确保某行某列某斜线棋子数量大于1就行
-
-
那么再考虑,空的不连续的情况,只需要验证,某一行还是某一列,还是某个斜线有一个X就可以了,且没有O,即大于等于1
3.下了4步棋,只需要找到某行某列某斜线数量为2就行
所以只需要找棋子数量>0就行
这样屑的话应该会比较短,有错T我
#include<bits/stdc++.h>
using namespace std;
#define ll long long
int t;
map<int,int> mp[5];
void solve(){
int cnt=0;
mp[1].clear();mp[2].clear();
for(int i=1;i<=3;++i)
for(int j=1;j<=3;++j){
char p;cin>>p;
if(p=='G') continue;
++cnt;
mp[1][i]+=(p=='X')?1:-5;
mp[2][j]+=(p=='X')?1:-5;
if(i+j==4)mp[1][i+j]+=(p=='X')?1:-5;
if(i-j==0)mp[1][i-j]+=(p=='X')?1:-5;
}
bool book=0;
int res=0;cnt/=2;
for(int i=1;i<=3;++i)
for(auto [x,y]:mp[i])
if(y>0) book=1;
if(cnt<=2) puts("Yes");
else {
if(book)puts("Yes");
else puts("No");
}
}
int main(){
cin>>t;
while(t--){
solve();
}
return 0;
}
这题你说是思维吧也是
但是你说不是嘛,也可以打表列出所有情况找规律
实在不行,人工列表,情况就这么点