Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<iostream>
- #include<vector>
- // Задача № 1. Игра НИМ (для 2 кучек)
- // B игре НИМ имеется несколько (2) кучек камней.
- // В свой ход разрешается взять любое положительное количество камней из одной кучки. Кто не может сделать ход, тот проиграл.
- // Первый ход делает первый игрок (Mr First)
- // Ваша задача вывести победителя при оптимальной игре обоих игроков (Mr First и Mr Second).
- // Решаем через динамическое программирование.
- // Мы создадим таблицу размера куч и будем отмечать в ячейке v[i][j] (i, j = кол-во камней в 1 и 2 кучах соответственно)
- // 0 - если игрок, находящийся в ней проигрывает
- // 1 - если игрок, находящийся в ней побеждает
- // При этом все игроки играют оптимально (по-умному).
- int main () {
- int n, m;
- std::cin >> n >> m; // n, m - кол-во камней в 1 и 2 кучах соответственно.
- std::vector<std::vector<int>> v(n + 1, std::vector<int>(m + 1, 0));
- for (auto i = 0; i < n + 1; i++) {
- for (auto j = 0; j < m + 1; j++) {
- for (auto x = 0; x < i; x++) {
- if (v[x][j] == 0) {
- v[i][j] = 1; // Если мы можем перевести игрока в проигрыш, убрав несколько камней из 1 кучи, то значит мы побеждаем.
- break;
- }
- }
- for (auto y = 0; y < j; y++) {
- if (v[i][y] == 0) {
- v[i][j] = 1; // Если мы можем перевести игрока в проигрыш, убрав несколько камней из 2 кучи, то значит мы побеждаем.
- break;
- }
- }
- }
- }
- if (v[n][m] == 0) {
- std::cout << "Second" << std::endl; // Наш победитель - Mr Second!
- } else {
- std::cout << "First" << std::endl; // Наш победитель - Mr First!
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement