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";
}

码很粗糙,暴力,有没有更简洁的让我看看