#include <iostream>
#include <stdlib.h>
using namespace std;
class Heap//класс куча
{
private:
int size;//размер кучи
public:
Heap(int s): size(s){};//конструктор инициализации
int get(int n=0){ size -=n; return size;};//возврат текущего размера кучи
};
class Gambler
{
protected:
Heap* heap;//указатель на кучу
const int limit;//максимальное количесво предметов, которые можно взять
const char* name;//имя игрока
public:
Gambler(Heap& h, int l) : limit(l) {heap = &h;};//конструктор инициализации
int query();//функция запроса хода
virtual int move() = 0;
virtual ~Gambler(){};//виртуальный деструктор
};
int Gambler::query()
{
cout « " Heap = " « heap->get() « " " « name « " > ";
return heap->get();
}
class Man : public Gambler//класс игрока
{
public:
Man (Heap &h, int l, const char* n) : Gambler(h,l) { name=n; };//конструктор инициализации
virtual int move();
};
class Pen : public Gambler//класс компьютера
{
public:
Pen (Heap &h, int l, const char* n) : Gambler(h,l) { name=n; };//конструктор инициализации
virtual int move();
};
int Man::move()
{
int g;
cin » g;//количество предметов, которое берет из кучи игрок
if ((g < 1) || (g > (heap->get())) || ( g > limit))//если введенное количество предметов из кучи достать нельзя
{
g = 1;
}
return heap->get(g);
}
int Pen::move()
{
int rest = 0;//остаток кучи,который должен остаться после хода компьютера
int x = 0;//величина выигрышной стратегии
int h = 0;//текущий остаток кучи
if ( (h=(heap->get())) == 1 )
{
h = heap->get(1);
}
while ((rest = (x*limit + x +1)) <= h )//находим нужный остаток кучи
{
x++;
}
if ((rest>h) || (rest==h))//если остаток привышает количество кучи, то возвращаемся на оидн ход назад
{
rest = (x-1)*limit + x;
}
heap->get(h-rest);//уменьшаем кучу на разность между текущим остатком кучи и желаемым остатком
cout << h-rest << endl;
return (heap->get());
}
int main(int argc, char* argv[])
{
int i=0;//отслеживание ходов игрока и компьютера, для определения очередности ходов
Heap h(atoi(argv[1]));//создаем кучу
Gambler* g[] = { new Pen(h,atoi(argv[2]), "Pen"), new Man(h,atoi(argv[2]), "Man") };//указатели на объекты игроков
while ( g[i]->query() != 0 )
{
g[i]->move();//сам ход
if (++i > 1)//смена хода
i = 0;
}
cout << "Winner\n";
delete g[0];
delete g[1];
return 0;
}
{"html5":"htmlmixed","css":"css","javascript":"javascript","php":"php","python":"python","ruby":"ruby","lua":"text\/x-lua","bash":"text\/x-sh","go":"go","c":"text\/x-csrc","cpp":"text\/x-c++src","diff":"diff","latex":"stex","sql":"sql","xml":"xml","apl":"apl","asterisk":"asterisk","c_loadrunner":"text\/x-csrc","c_mac":"text\/x-csrc","coffeescript":"text\/x-coffeescript","csharp":"text\/x-csharp","d":"d","ecmascript":"javascript","erlang":"erlang","groovy":"text\/x-groovy","haskell":"text\/x-haskell","haxe":"text\/x-haxe","html4strict":"htmlmixed","java":"text\/x-java","java5":"text\/x-java","jquery":"javascript","mirc":"mirc","mysql":"sql","ocaml":"text\/x-ocaml","pascal":"text\/x-pascal","perl":"perl","perl6":"perl","plsql":"sql","properties":"text\/x-properties","q":"text\/x-q","scala":"scala","scheme":"text\/x-scheme","tcl":"text\/x-tcl","vb":"text\/x-vb","verilog":"text\/x-verilog","yaml":"text\/x-yaml","z80":"text\/x-z80"}