Задача
Условие

Камень > ножницы > бумага > камень > ножницы > …
Следующие правила описывают правила победы:
- Камень всегда побеждает Ножницы (Камень раздавливает Ножницы)
- Ножницы всегда побеждают Бумагу (Ножницы режут Бумагу)
- Бумага всегда бьет Камень (Бумага покрывает Камень)
Входные данные
Первая строка содержит количество тестов $t$ ($0 < t < 1000$). Первая строка каждого теста содержит количество раундов $n$ ($0 < n < 100$), сыгранных в игру Камень, Ножницы, Бумага. Каждая из следующих $n$ строк содержит одну из заглавных букв $R$ (Камень), $P$ (Бумага) или $S$ (Ножницы), пробел и снова заглавную букву $R$, $P$ или $S$. Первая буква обозначает выбор первого игрока, вторая буква — выбор второго игрока.
Выходные данные
Для каждого теста в отдельной строке вывести имя победителя (Player 1 или Player 2). Если игра заканчивается вничью, вывести TIE.
Тесты
№ | Входные данные | Выходные данные |
1 | 3 2 R P S R 3 P P R S S R 1 P R |
Player 2 TIE Player 1 |
2 | 1 1 S P |
Player 1 |
3 | 2 3 S P P S R R 2 P R S R |
TIE TIE |
4 | 4 1 R P 2 R P S R 3 R P S R P S 4 P R R S P S S S |
Player 2 Player 2 Player 2 Player 1 |
Решение
Для решения задачи необходимо сравнить выбор первого и второго игрока в каждом раунде каждого теста.
Подсчитываем количество побед для игроков во всех раундах теста. Получаем победителя для каждого теста.
В данной реализации используем вложенные циклы. Вводим переменную $t$ — количество тестов. Затем задаём цикл, в котором вводим новую переменную $n$ — количество раундов для каждого теста. Этот цикл будет работать, пока не проверим все тесты. Так же заводим два счётчика
sum1 и
sum2, которые будут подсчитывать победы первого и второго игрока. Задаём ещё один цикл, который будет выполняться, пока не проверим все раунды для каждого теста. В нём вводим выбор первого игрока и выбор второго игрока. Сравниваем данные значения согласно правилам победы, которые описаны в условии. В случае победы первого игрока увеличиваем переменную
sum1 на единицу, в случае победы второго —
sum2 на единицу. После завершения циклов сравниваем переменные
sum1 и
sum2, выводим соответствующие результаты.
Код программы
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
#include <iostream> using namespace std; int main() { int t; // количество тестов cin >> t; for (int i = 0; i < t; i++) { // цикл для тестов int n; // количество раундов cin >> n; int sum1 = 0, sum2 = 0; // счётчики побед первого и второго игроков for (int j = 0; j < n; j++) { // цикл для раундов char p1, p2; // выбор первого и второго игроков cin >> p1 >> p2; if ((p2 == 'R' and p1 == 'S') or (p2 == 'S' and p1 == 'P') or (p2 == 'P' and p1 == 'R')) { sum2++; } else if (p1 != p2) { sum1++; } } if (sum1 > sum2) { cout << "Player 1" << endl; } else if (sum2 > sum1) { cout << "Player 2" << endl; } else cout << "TIE" << endl; } return 0; } |
Если неверно, что $a > b$ и неверно, что $b > a$, тогда для целых (и даже действительных) $a$ и $b$ справедливо, что $a = b.$ Поэтому последний if избыточен.
Спасибо за комментарий. Исправила.
Хорошо.
Теперь немного поработаем над реализацией этого же аспекта в другом месте кода. В игре двух лиц возможны три исхода — победил 1, или 2, или ничья. А значит понадобится проверка двух условий. Оставшийся третий случай проверять не придется. Осталось разумно выбрать эти два условия. Для проверки выигрыша любого из игроков приходится писать довольно длинное составное условие. А проверка на ничью? Просто равенство введенных символов.
Давайте в качестве упражнения заменим одно из двух длинных условий на одно короткое.
Это нам еще повезло, что задачу создавал не Шелдон

Спасибо за комментарий. Исправила.