Krzysztof Diks, Marcin Kubica |
Tłumaczenie |
Rodzina gier Mankala jest znana ludzkości od dawna. W tym zadaniu rozważamy grę specjalnie wymyślona na potrzeby IOI. W grze bierze udział dwóch graczy. Do dyspozycji mają okrągłą planszę z siedmioma dołkami na obwodzie, a dodatkowo każdy z graczy ma swój dołek-bank. Gra rozpoczyna się od losowego rozłożenia 20 kamieni w dołkach na planszy w taki sposób, że w każdym z nich znajdują się co najmniej 2 i co najwyżej 4 kamienie. Gracze wykonują ruchy na przemian. Ruch gracza polega na wyborze niepustego dołka na planszy i wzięciu z niego wszystkich kamieni do ręki. Mając kamienie w ręku, gracz bierze pod uwagę kolejne dołki (w kierunku ruchu wskazówek zegara), zaczynając od następnego po opróżnionym, i wykonuje następujące czynności:
Więcej niż jeden kamień w ręce: Jeżeli w rozważanym dołku jest 5 kamieni, to bierze jeden kamień z dołka i przekłada go do swojego banku, w przeciwnym przypadku, odkłada jeden kamień z ręki do rozważanego dołka.
Jeden kamień w ręce: Jeżeli w rozważanym dołku jest co najmniej jeden, a co najwyżej 4 kamienie, to przekłada wszystkie kamienie z tego dołka oraz jeden z ręki do swojego banku, w przeciwnym przypadku (gdy w dołku jest 0 lub 5 kamieni) odkłada jedyny kamień z ręki do banku przeciwnika.
Gra się kończy, gdy wszystkie dołki na planszy są puste, a zwycięża ten gracz, który ma więcej kamieni w swoim banku.
Gracz, który rozpoczyna ma zawsze strategię wygrywającą. Twoim zadaniem jest napisanie programu, który gra w Ioiwari jako gracz rozpoczynający i wygrywa. Przeciwnik, program testujący, gra optymalnie, tzn. jeśli tylko dać mu szansę, to wygra, a Twój program przegra.
Twój program powinien czytać ze standardowego wejścia i pisać na standardowe wyjście. Twój program to gracz nr 1, a jego przeciwnik to gracz nr 2. Po rozpoczęciu, Twój program musi najpierw wczytać siedem liczb całkowitych p1,... p7, zapisanych w jednym wierszu: początkowe liczby kamieni odpowiednio w dołkach 1,... ,7 na planszy. Dołki na planszy są ponumerowane od 1 do 7, zgodnie z ruchem wskazówek zegara. Na samym początku gry banki graczy są puste. Twój program powinien grać jak następuje:
Jeśli jest to ruch Twojego programu, to powinien on wypisać na standardowe wyjście numer dołka opisujący ruch.
Jeśli jest to ruch przeciwnika, to Twój program powinien wczytać ze standardowego wejścia numer (opróżnianego) dołka określający ten ruch.
Masz do dyspozycji program (ioiwari2 pod Linuxem, ioiwari2.exe pod Windowsami), który dla jednego początkowego rozmieszczenia kamieni gra optymalnie jako gracz nr 2. Program ten wypisuje na standardowe wyjście pierwszy wiersz, jaki powinien wczytać Twój program, opisujący początkowe rozmieszczenie kamieni w dołkach na planszy: 4 3 2 4 2 3 2. Następnie program ten gra, próbując czytać ze standardowego wejścia ruchy gracza nr 1 i wypisując swoje ruchy na standardowe wyjście. Możesz uruchomić swój program i ioiwari2 w oddzielnych okienkach i ręcznie wymieniać dane pomiędzy programami. Przebieg dialogu jest zapisywany w pliku ioiwari.out.
W poniższych przykładach, ostatnia liczba całkowita z wejścia jest wczytywana na zmienną last, a zmienna mymove zawiera Twój ruch.
Jeśli programujesz w C++ i używasz iostreams, powinieneś stosować następującą konwencję wczytywania ze standardowego wejścia i wypisywania na standardowe wyjście:
cout<<mymove<<endl<<flush; cin>>last;
Jeśli programujesz w C lub C++ i używasz scanf i printf, powinieneś stosować następującą konwencję wczytywania ze standardowego wejścia i wypisywania na standardowe wyjście:
printf(" scanf ("
Jeśli programujesz w Pascalu, powinieneś stosować następującą konwencję wczytywania ze standardowego wejścia i wypisywania na standardowe wyjście:
Writeln(mymove); Readln(last);
Oto poprawny ciąg 6 ruchów:
Za zwycięstwo w jednym teście Twój program otrzyma 4 punkty, za remis 2 punkty, a w pozostałych sytuacjach 0 punktów.