Подразделы

Другие разделы

Дата и время

16/11/2024 17:14:13

Авторизация

Имя:
Пароль:
Зарегистрироваться
Восстановить пароль
 

printРешение задачи Калах

Тема: техническая задача, моделирование

Для хранения текущего состояния игры будем использовать массив `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;
loading