Решение задачи Калах
Тема: техническая задача, моделирование
Для хранения текущего состояния игры будем использовать массив
`d`:
d:array[1..2, 1..7] of integer;
Номер игрока, делающего ход, хранится в переменной
`h`:
h:integer;
Инициализируем эти переменные следующим образом:
for s:=1 to 2 do
begin
for i:=1 to 6 do
d[s,i]:=3;
d[s,7]:=0;
end;
h:=1;
Для каждого хода выполняем следующие действия:
var s, { текущая сторона калаха }
k, { камни в руке }
p:integer; { номер текущей лунки }
...
{ считываем номер лунки }
read(p);
{ забираем все камни из лунки }
k:=d[h,p];
d[h,p]:=0;
{ начиная со следующей лунки }
inc(p);
s:=h;
while true do
begin
{ кладем камень }
inc(d[s,p]);
dec(k);
{ камней не осталось - выходим из цикла }
if k=0 then break;
inc(p);
if (p>7) or (p>6) and (s<>h) { дошли до калаха } then
begin
s:=3-s; { Переходим на другую сторону}
p:=1;
end;
end;
Когда камни разложены, проверяем условия на специальные ходы:
if (s=h) and (d[h,p]=1) and (p<7) and (d[3-h,7-p]>0) then
{ положили последний камень в пустую лунку на своей стороне }
begin
{ перекладываем камни в калах из своей и противоположной лунок }
d[h,7]:=d[h,7]+d[3-h,7-p]+d[h,p];
d[h,p]:=0;
d[3-h,7-p]:=0;
end;
{ если последний камень попал не в свой калах - передаем ход }
if p<>7 then
h:=3-h;
После обработки всех ходов выводим состояние лунок:
for s:=1 to 2 do
begin
for i:=1 to 6 do
write(d[s,i],' ');
writeln(d[s,7]);
end;