#include #include 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; }