Advertisement
egormerk

37plk

Mar 7th, 2021 (edited)
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.26 KB | None | 0 0
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. // на основе этого видео https://youtu.be/hSbDxT8i1uY
  6.  
  7. // написано для задачи 37 Полякова 2021
  8.  
  9. // функция для 19-й задачи
  10. bool f19(int x, int y, int p) {
  11.     // P - позиция
  12.     //    0     1     2     3     4
  13.     // (7; s)  Петя  Ваня  Петя  Ваня
  14.     if (x + y >= 61 && p == 2) {
  15.         return true;
  16.     }
  17.     // если мы находимся на нужном ходе (P), а сумма меньше нужной,
  18.     // то возвращаем false, т.к. это нам не подходит
  19.     else {
  20.         if (x + y < 61 && p == 2) {
  21.             return false;
  22.         }
  23.     }
  24.     // рекурсивно вызываем все возможные ходы
  25.     return f19(x + 1, y, p + 1) || f19(x * 2, y, p + 1) || f19(x, y + 1, p + 1) || f19(x, y * 2, p + 1);
  26. }
  27.  
  28. // преобразуем эту же функцию для 20-й задачи
  29. bool f20(int x, int y, int p) {
  30.     // меняем P на нужное
  31.     if (x + y >= 61 && p == 3) {
  32.         return true;
  33.     }
  34.     else {
  35.         // меняем P
  36.         if (x + y < 61 && p == 3) {
  37.             return false;
  38.         }
  39.         else {
  40.             // сумма больше нужной, а P нам не подходит (иначе сработало бы первое условие)
  41.             // возвращаем false
  42.             if (x + y >= 61) {
  43.                 return false;
  44.             }
  45.         }
  46.     }
  47.     // Петя выигрывает вторым ходом независимо от хода Вани,
  48.     // поэтому все ходы Пети после Вани должны быть true
  49.     // ходы Пети нечётные P = 1, 3, 5
  50.     // поэтому оператор И используем на ходах Пети, где значения P нечётные
  51.     // эту часть важно хорошо понимать - если неправильно написать условие,
  52.     // то программа либо ничего не выведет, либо выведет неправильные значения (их будет больше двух)
  53.     if (p % 2 != 0) // тут ПЕТЯ
  54.         return f20(x + 1, y, p + 1) && f20(x * 2, y, p + 1) && f20(x, y + 1, p + 1) && f20(x, y * 2, p + 1);
  55.     else
  56.         return f20(x + 1, y, p + 1) || f20(x * 2, y, p + 1) || f20(x, y + 1, p + 1) || f20(x, y * 2, p + 1);
  57. }
  58.  
  59. bool f21(int x, int y, int p) {
  60.     if (x + y >= 61 && (p == 2 || p == 4)) {
  61.         return true;
  62.     }
  63.     else {
  64.         if (x + y < 61 && p == 4) {
  65.             return false;
  66.         }
  67.         else {
  68.             if (x + y >= 61) {
  69.                 return false;
  70.             }
  71.         }
  72.     }
  73.     if (p % 2 == 0) // тут Ваня
  74.         return f21(x + 1, y, p + 1) && f21(x * 2, y, p + 1) && f21(x, y + 1, p + 1) && f21(x, y * 2, p + 1);
  75.     else
  76.         return f21(x + 1, y, p + 1) || f21(x * 2, y, p + 1) || f21(x, y + 1, p + 1) || f21(x, y * 2, p + 1);
  77. }
  78.  
  79. // преобразуем предыдущую функцию для 21-й задачи
  80. bool f21d(int x, int y, int p) {
  81.     // у нас теперь два P
  82.     if (x + y >= 61 && p == 2) {
  83.         return true;
  84.     }
  85.     else {
  86.         if (x + y < 61 && p == 2) {
  87.             return false;
  88.         }
  89.         else {
  90.             if (x + y >= 61) {
  91.                 return false;
  92.             }
  93.         }
  94.     }
  95.     if (p % 2 == 0) // тут Ваня
  96.         return f21(x + 1, y, p + 1) && f21(x * 2, y, p + 1) && f21(x, y + 1, p + 1) && f21(x, y * 2, p + 1);
  97.     else
  98.         return f21(x + 1, y, p + 1) || f21(x * 2, y, p + 1) || f21(x, y + 1, p + 1) || f21(x, y * 2, p + 1);
  99. }
  100.  
  101. int main() {
  102.     cout << "19: ";
  103.     for (int i = 1; i < 50; i++) {
  104.         if (f19(10, i, 0)) {
  105.             cout << i;
  106.             break;
  107.         }
  108.     }
  109.     cout << endl << "20: ";
  110.     for (int i = 1; i <= 50; i++) {
  111.         if (f20(10, i, 0)) cout << i << " ";
  112.     }
  113.     cout << endl << "21: ";
  114.     for (int i = 1; i <= 50; i++) {
  115.         if (f21(10, i, 0)) cout << i << " ";
  116.     }
  117.     cout << endl << "No 21: ";
  118.     for (int i = 1; i <= 50; i++) {
  119.         if (f21d(10, i, 0)) cout << i << " ";
  120.     }
  121. }
  122.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement