Задача на разбор случаев

Готов ответить на любые вопросы по моему коду

Условие такое: Напишите программу, которая по изображению поля для игры в «Крестики-нолики» определит, могла ли такая ситуация возникнуть в результате игры с соблюдением всех правил.

Напомним, что игра в «Крестики-нолики» ведется на поле 3*3. Два игрока ходят по очереди. Первый ставит крестик, а второй – нолик. Ставить крестик и нолик разрешается в любую еще не занятую клетку поля. Когда один из игроков поставит три своих знака в одной горизонтали, вертикали или диагонали, или когда все клетки поля окажутся заняты, игра заканчивается. Я написал следующий код, но я получаю WA на 21 тесте:

a = []
a.append(list(map(int, input().split())))
a.append(list(map(int, input().split())))
a.append(list(map(int, input().split())))
k = 0
one = 0
two = 0
for i in a:
    for j in i:
        if j == 1:
            one += 1
        elif j == 2:
            two += 1
b1 = b2 = b3 = b4 = b5 = b6 = b7 = b8 = 0
for_two = 0
if a[0][0] == a[0][1] == a[0][2] != 0:  # 1 строка
    k += 1
    b1 = 1
    if a[0][2] == 2:
        for_two = 1
if a[1][0] == a[1][1] == a[1][2] != 0:  # 2 строка
    k += 1
    b7 = 1
    if a[1][2] == 2:
        for_two = 1
if a[2][0] == a[2][1] == a[2][2] != 0:  # 3 строка
    k += 1
    b8 = 1
    if a[2][2] == 2:
        for_two = 1
if a[0][0] == a[1][0] == a[2][0] != 0:  # 1 столбец
    k += 1
    b2 = 1
    if a[2][0] == 2:
        for_two = 1
if a[0][1] == a[1][1] == a[2][1] != 0:  # 2 столбец
    k += 1
    b4 = 1
    if a[2][1] == 2:
        for_two = 1
if a[0][2] == a[1][2] == a[2][2] != 0:  # 3 столбец
    k += 1
    b5 = 1
    if a[2][2] == 2:
        for_two = 1
if a[0][0] == a[1][1] == a[2][2] != 0:  # главная диагональ
    k += 1
    b3 = 1
    if a[2][2] == 2:
        for_two = 1
if a[2][0] == a[1][1] == a[0][2] != 0:  # побочная диагональ
    k += 1
    b6 = 1
    if a[0][2] == 2:
        for_two = 1
if one - two < 0 or one - two > 1:
    print("NO")
elif k > 2:
    print("NO")
elif k == 1:
    if for_two == 1 and one - two == 0:
        print("YES")
    elif one - two == 0:
        print("NO")
    else:
        print("YES")
elif k == 0:
    print("YES")
else:
    if b1 == 1 and (b1 == b2 or b1 == b4 or b1 == b5 or b1 == b3 or b1 == b6):
        print("YES")
    elif b2 == 1 and (b2 == b7 or b2 == b8 or b2 == b3 or b2 == b6):
        print("YES")
    elif b5 == 1 and (b5 == b7 or b5 == b8 or b5 == b3 or b5 == b6):
        print("YES")
    elif b8 == 1:
        if b8 == b2 or b8 == b4 or b8 == b5 or b8 == b3 or b8 == b6:
            print("YES")
        else:
            print("NO")
    elif b7 == 1 and (b7 == b4 or b7 == b3 or b7 == b6):
        print("YES")
    elif b4 == 1 and (b4 == b3 or b4 == b6):
        print("YES")
    elif b3 == 1 and b3 == b6:
        print("YES")
    else:
        print("NO")

Пример теста:

2 1 1
1 1 2
2 2 1

Ответ

YES

Ответы (1 шт):

Автор решения: Welant

Не знаю, будет ли полезно решение реализованное на C++, но на всякий вот оно. P.S. Код прошел все тесты

using namespace std; 

int main() {
int matrix[3][3];
int counter=0, counter_for_1 = 0, counter_for_2 = 0, line=0, main_diagonal=0, secondary_diagonal=0, column=0;
bool wintwo=false, winone = false;

ifstream in ("input.txt");

for (int i = 0; i < 3; i++) {
    if (line == 3) {
        counter++;
        winone = true;
    }
    if (line == 6) {
        counter++;
        wintwo = true;
    }
    line = 0;
    for (int j = 0; j < 3; j++) {
        //Считываем из файла данные
        in >> matrix[i][j];
        //Считаем количество еденичек
        if (matrix[i][j] == 1) {
            counter_for_1++;
        }
        //Считаем количество двоек
        if (matrix[i][j] == 2) {
            counter_for_2++;
        }
        //Пробегаемся по строкам и ищем количество выйгрышных
        line += matrix[i][j];
        if (matrix[i][j] == 0) {
            line += 10;
        }
        //Определяем выйгрышная ли главная диагональ
        if (i == j) {
            if (matrix[i][j] == 0) {
                main_diagonal += 10;
            }
            main_diagonal += matrix[i][j];
        }
        //определяем выйгрышная ли побочная диагональ
        if (i + j == 2) {
            if (matrix[i][j] == 0) {
                secondary_diagonal += 10;
            }
            secondary_diagonal += matrix[i][j];
        }
    }           
}

for (int j = 0; j < 3; j++) {
    if (column == 3) {
        counter++;
        winone = true;
    }
    if (column == 6) {
        counter++;
        wintwo = true;
    }
    column = 0;
    for (int i=0; i < 3; i++) {
        //Определяем выйгрышная ли колонка
        column += matrix[i][j];
        if (matrix[i][j] == 0) {
            column += 10;
        }
    }
}

if (main_diagonal == 3) {
    counter++;
    winone = true;
}
if (main_diagonal == 6) {
    counter++;
    wintwo = true;
}
if (secondary_diagonal == 3) {
    counter++;
    winone = true;
}
if (secondary_diagonal == 6) {
    counter++;
    wintwo = true;
}

//Финальная проверка на повторные ходы участников и выставление коэффициентов
if (wintwo == false && winone == false) {
    if ((counter_for_1 - counter_for_2) > 1){
        counter += 10;
    }
    if ((counter_for_1 - counter_for_2) < 0) {
        counter += 10;
    }
}

if (wintwo == true && winone == true) {
    counter += 10;
}

if (winone == true) {
    if (counter_for_1 == counter_for_2) {
        counter += 10;
    }
    if ((counter_for_1 - counter_for_2) > 1) {
        counter += 10;
    }
    if ((counter_for_1 - counter_for_2) < 0) {
        counter += 10;
    }
    if ((counter_for_1 + counter_for_2) == 9) {
        counter --;
    }
}

if(wintwo == true) {
    if (counter_for_1 != counter_for_2) {
        counter += 10;
    }
}

//Вывод полученных результатов
if (counter < 2) {
    cout << "YES";
}
else {
    cout << "NO";
}

}

→ Ссылка