How to resolve the algorithm Solve a Hidato puzzle step by step in the Seed7 programming language

Published on 12 May 2024 09:40 PM

How to resolve the algorithm Solve a Hidato puzzle step by step in the Seed7 programming language

Table of Contents

Problem Statement

The task is to write a program which solves Hidato (aka Hidoku) puzzles. The rules are: For example the following problem has the following solution, with path marked on it:

Let's start with the solution:

Step by Step solution about How to resolve the algorithm Solve a Hidato puzzle step by step in the Seed7 programming language

Source code in the seed7 programming language

$ include "seed7_05.s7i";

var set of integer: given is {};
var array array integer: board is 0 times 0 times 0;
var integer: startRow is 0;
var integer: startColumn is 0;
 
const proc: setup (in array string: input) is func
  local
    var integer: r is 0;
    var integer: c is 0;
    var array string: row is 0 times "";
    var string: cell is "";
    var integer: value is 0;
  begin
    board := (length(input) + 2) times 0 times 0;
    for key r range input do
      row := split(input[r], " ");
      board[r + 1] := (length(row) + 2) times - 1;
      for key c range row do
        cell := row[c];
        if cell = "_" then
          board[r + 1][c + 1] := 0;
        elsif cell[1] in {'0' .. '9'} then
          value := integer parse cell;
          board[r + 1][c + 1] := value;
          incl(given, value);
          if value = 1 then
            startRow := r + 1;
            startColumn := c + 1;
          end if;
        end if;
      end for;
    end for;
    board[1] := (length(row) + 2) times - 1;
    board[length(input) + 2] := (length(row) + 2) times - 1;
  end func;

const func boolean: solve (in integer: r, in integer: c, in integer: n) is func
  result
    var boolean: solved is FALSE;
  local
    var integer: back is 0;
    var integer: i is 0;
    var integer: j is 0;
  begin
    if n > max(given) then
      solved := TRUE;
    elsif board[r][c] = 0 and n not in given or board[r][c] = n then
      back := board[r][c];
      board[r][c] := n;
      for i range -1 to 1 until solved do
        for j range -1 to 1 until solved do
          solved := solve(r + i, c + j, n + 1);
        end for;
      end for;
      if not solved then
        board[r][c] := back;
      end if;
    end if;
  end func;

const proc: printBoard is func
  local
    var integer: r is 0;
    var integer: c is 0;
  begin
    for key r range board do
      for c range board[r] do
        if c = -1 then
          write(" . ");
        elsif c > 0 then
          write(c lpad 2 <& " ");
        else
          write("__ ");
        end if;
      end for;
      writeln;
    end for;
  end func;

const proc: main is func
  local
    const array string: input is [] ("_ 33 35 _ _ . . .",
                                     "_ _ 24 22 _ . . .",
                                     "_ _ _ 21 _ _ . .",
                                     "_ 26 _ 13 40 11 . .",
                                     "27 _ _ _ 9 _ 1 .",
                                     ". . _ _ 18 _ _ .",
                                     ". . . . _ 7 _ _",
                                     ". . . . . . 5 _");
  begin
    setup(input);
    printBoard;
    writeln;
    if solve(startRow, startColumn, 1) then
      writeln("Found:");
      printBoard;
    end if;
  end func;

  

You may also check:How to resolve the algorithm String interpolation (included) step by step in the PARI/GP programming language
You may also check:How to resolve the algorithm Sudoku step by step in the Clojure programming language
You may also check:How to resolve the algorithm Increment a numerical string step by step in the Lang programming language
You may also check:How to resolve the algorithm Delete a file step by step in the Nemerle programming language
You may also check:How to resolve the algorithm Call a foreign-language function step by step in the Clojure programming language