Задача на разбор случаев
Готов ответить на любые вопросы по моему коду
Условие такое: Напишите программу, которая по изображению поля для игры в «Крестики-нолики» определит, могла ли такая ситуация возникнуть в результате игры с соблюдением всех правил.
Напомним, что игра в «Крестики-нолики» ведется на поле 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 шт):
Не знаю, будет ли полезно решение реализованное на 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";
}
}