Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежит куча камней.
Игроки ходят по очереди, первый ход делает Петя.
За один ход игрок может добавить в кучу один камень или увеличить количество камней в куче в три раза.
Например, имея кучу из 15 камней, за один ход можно получить кучу из 16 или 45 камней.
У каждого игрока, чтобы делать ходы, есть неограниченное количество камней.
Игра завершается в тот момент, когда количество камней в куче становится не менее 66.
Победителем считается игрок, сделавший последний ход, то есть первым получивший кучу, в которой будет 66 или больше камней.
В начальный момент в куче было S камней, 1 ≤ S ≤ 65.
Будем говорить, что игрок имеет выигрышную стратегию, если он может выиграть при любых ходах противника.
Описать стратегию игрока — значит, описать, какой ход он должен сделать в любой ситуации,
которая ему может встретиться при различной игре противника.
Выполните следующие задания. Во всех случаях обосновывайте свой ответ.
1. а) Укажите все такие значения числа S, при которых Петя может выиграть в один ход.
Обоснуйте, что найдены все нужные значения S, и укажите выигрывающий ход для каждого указанного значения S.
б) Укажите такое значение S, при котором Петя не может выиграть за один ход, но при любом ходе
Пети Ваня может выиграть своим первым ходом. Опишите выигрышную стратегию Вани.
2. Укажите два таких значения S, при которых у Пети есть выигрышная стратегия,
причём (а) Петя не может выиграть за один ход и (б) Петя может выиграть своим вторым ходом независимо от того,
как будет ходить Ваня. Для каждого указанного значения S опишите выигрышную стратегию Пети.
3. Укажите значение S, при котором:
— у Вани есть выигрышная стратегия, позволяющая ему выиграть первым или вторым ходом при любой игре Пети,
и
— у Вани нет стратегии, которая позволит ему гарантированно выиграть первым ходом.
Для указанного значения S опишите выигрышную стратегию Вани. Постройте дерево всех партий, возможных при этой
выигрышной стратегии Вани (в виде рисунка или таблицы). На рёбрах дерева указывайте,
кто делает ход, в узлах — количество камней в куче.
#include <iostream>
using namespace std;
int main()
{
int n, m;
int **arr;
int min;
cout << "Enter dimension of array (n/m)" << endl;
cin >> n >> m;
arr = new int *[n];
for (int i = 0; i < n; i++) {
arr[i] = new int[m];
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cout << "arr[" << i << "][" << j << "] = ";
cin >> arr[i][j];
}
}
cout << "Your array:" << endl;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
cout << arr[i][j] << " ";
}
cout << endl;
}
cout << "Min is: ";
min = arr[0][0];
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (min > arr[i][j]) {
min = arr[i][j];
}
}
}
cout << min << endl;
return 0;
}
#include<iostream>
#include<cstdlib>
#include<ctime>
#include<conio.h>
using std::cout;
using std::cin;
using std::endl;
bool gameOver;
const int width = 25;
const int height = 25;
int x, y, fruitX, fruitY, score;
int tailX[100], tailY[100];
int nTail;
enum eDirection { STOP = 0, LEFT, RIGHT, UP, DOWN };
eDirection dir;
void Setup() {
gameOver = false;
dir = STOP;
x = width / 2 - 1;
y = height / 2 - 1;
fruitX = rand() % width;
fruitY = rand() % height;
score = 0;
};
void Draw() {
cout << "w = UP" << endl;
cout << "s = DOVN" << endl;
cout << "d = RIGHT" << endl;
cout << "a = LEFT" << endl;
system("cls");//system("clear");
for (int i = 0;i < width + 1;i++) {
cout << "##";
};
for (int i = 0;i < height;i++) {
for (int j = 0;j < width;j++) {
if (j == 0 || j == width - 1) {
cout << "##";
};
if (i == y && j == x) {
cout << "0";
}
else if (i == fruitY && j == fruitX) {
cout << "F";
}
else {
bool print = false;
for (int k = 0;k < nTail;k++) {
if (tailX[k] == j && tailY[k] == i) {
print = true;
cout << "o";
}
}
if (!print) {
cout << " ";
}
};
cout << " ";
};
cout << endl;
};
cout << endl;
for (int i = 0;i < width;i++) {
cout << "#";
};
cout << endl;
cout << "Score: " << score << endl;
};
void Input() {
if (_kbhit()) {
switch (_getch()) {
case'a': {
dir = LEFT;
}
break;
case'd': {
dir = RIGHT;
}
break;
case'w': {
dir = UP;
}
break;
case's': {
dir = DOWN;
}
break;
case'x': {
gameOver = true;
}
break;
}
};
};
void Logic() {
int prevX = tailX[0];
int prevY = tailY[0];
int prev2X, prev2Y;
tailX[0] = x;
tailY[0] = y;
for (int i = 1;i < nTail;i++) {
prev2X = tailX[i];
prev2Y = tailY[i];
tailX[i] = prevX;
tailY[i] = prevY;
prevX = prev2X;
prevY = prev2Y;
}
switch (dir)
{
case LEFT:
x--;
break;
case RIGHT:
x++;
break;
case UP:
y--;
break;
case DOWN:
y++;
break;
}
/*
if (x > width || x < 0 || y>height || y < 0) {
gameOver = true;
};*/
if (x >= width - 1) {
x = 0;
}
else if (x < 0) {
x = width - 2;
}
if (y >= height) {
y = 0;
}
else if (y < 0) {
y = height - 1;
}
for (int i = 0;i < nTail;i++) {
if (tailX[i] == x && tailY[i] == y) {
gameOver = true;
}
}
if (x == fruitX && y == fruitY) {
score += 10;
fruitX = rand() % width;
fruitY = rand() % height;
nTail++;
}
}
int main() {
srand(time(0));
Setup();
while (!gameOver) {
Draw();
Input();
Logic();
}
return 0;
}
Объяснение:
эта игра работает только в кампиляторе Visual studio или qt creater