E题
除了常规的遍历行,列,两个对角线,这一题因为能一次落两子所以还有一个L型棋盘你没有考虑到
GXO
GOX
GGG
这种情况,落两子(3,1)(2,1),那么对手会落(1,1)拦你,此时你已经赢定了,因为此时(3,2),(3,3)可以一次两子落完,直接胜利
那么,L型棋盘无论如何是一定能赢的
并且L型棋上只要不是O都能通过
萌新第一次写题解,你问我为什么要写?因为我结束了才通过E的
vector<string> s(3);
void solve(){
for(ll i = 0; i < 3; i++)cin >> s[i];
// 正对角
ll sum1 = 0, sum2 = 0;
for(ll i = 0; i < 3; i++){
if(s[i][i] == 'O')break;
else if(s[i][i] == 'X')
sum1 ++;
else if(s[i][i] == 'G')
sum2 ++;
}
if(sum1 + sum2 == 3 && sum1 >= 1){
cout << "Yes\n";
return;
}
// 反对角
sum1 = 0, sum2 = 0;
for(ll i = 2, j = 0; i >= 0; i--, j++){
if(s[i][j] == 'O')break;
else if(s[i][j] == 'X')
sum1 ++;
else if(s[i][j] == 'G')
sum2 ++;
}
if(sum1 + sum2 == 3 && sum1 >= 1){
cout << "Yes\n";
return;
}
// 横着的
for(ll i = 0; i < 3; i++){
sum1 = 0, sum2 = 0;
for(ll j = 0; j < 3; j++){
if(s[i][j] == 'O')
break;
else if(s[i][j] == 'X')
sum1 ++;
else if(s[i][j] == 'G')
sum2 ++;
}
if(sum1 + sum2 == 3 && sum1 >= 1){
cout << "Yes\n";
return;
}
else if(sum2 == 3 && i == 0){
if((s[1][0] == 'G'||s[1][0] == 'X') && (s[2][0] == 'G'||s[2][0] == 'X')){
cout << "Yes\n";
return;
}
else if((s[1][2] == 'G'||s[1][2] == 'X') && (s[2][2] == 'G'||s[2][2] == 'X')){
cout << "Yes\n";
return;
}
else;
}
else if(sum2 == 3 && i == 2){
if((s[0][0] == 'G'||s[0][0] == 'X') && (s[1][0] == 'G'||s[1][0] == 'X')){
cout << "Yes\n";
return;
}
else if((s[0][2] == 'G'||s[0][2] == 'X') && (s[1][2] == 'G'||s[1][2] == 'X')){
cout << "Yes\n";
return;
}
else;
}
}
// 竖着的
for(ll i = 0; i < 3; i++){
ll sum1 = 0, sum2 = 0;
for(ll j = 0; j < 3; j++){
if(s[j][i] == 'O')
break;
else if(s[j][i] == 'X')
sum1 ++;
else if(s[j][i] == 'G')
sum2 ++;
}
if(sum1 + sum2 == 3 && sum1 >= 1){
cout << "Yes\n";
return;
}
else if(sum2 == 3 && i == 0){
if((s[0][1] == 'G'||s[0][1] == 'X') && (s[0][2] == 'G'||s[0][2] == 'X')){
cout << "Yes\n";
return;
}
else if((s[2][1] == 'G'||s[2][1] == 'X') && (s[2][2] == 'G'||s[2][2] == 'X')){
cout << "Yes\n";
return;
}
else;
}
else if(sum2 == 3 && i == 2){
if((s[0][0] == 'G'||s[0][0] == 'X') && (s[0][1] == 'G'||s[0][1] == 'X')){
cout << "Yes\n";
return;
}
else if((s[2][0] == 'G'||s[2][0] == 'X') && (s[2][1] == 'G'||s[2][1] == 'X')){
cout << "Yes\n";
return;
}
else;
}
}
// 输定了
cout << "No\n";
}
码很粗糙,暴力,有没有更简洁的让我看看