POV-Ray : Newsgroups : povray.binaries.images : Sudoku : Re: Sudoku Server Time
14 Jan 2025 18:40:47 EST (-0500)
  Re: Sudoku  
From: kurtz le pirate
Date: 13 Jan 2025 04:38:54
Message: <6784df2e@news.povray.org>
On 11/01/2025 09:23, jr wrote:
> 
> the board (above) doesn't tell me very much, how do you deal with the nine
> sub-squares ?  how do keep track of the values a given cell (still) can take ?
> (and many other such questions :-))
> 


Yes, I admit I didn't give much information.


On 10/01/2025 19:10, Bald Eagle wrote:
 > jr pointed out that if you use dictionaries, you won't get the
 > "too many nested...." error.

I don't see how dictionaries could help me at all.



Here's the macro code where I put a lot of comments.
'a' parameter containt the 9x9 array typically called by : Solve(board)

// ---------------------------------------------------------------------
// The recursive solve() procedure
// ---------------------------------------------------------------------
#macro Solve(a)

  /*
  // Counts the number of times the function calls itself.
  #declare solve_count = solve_count+1;
  #debug concat(" solve_count = ",str(solve_count,0,0),"\n")
  */

  // Set default value do false : sudoku not solved by default
  #local solve_value = false;

  // Find an empty cell (the first one)
  #local (Result,Row,Col) = find_empty(a);

  // find_empty say that there is no empty cell
  #if (!Result)
   // all cells are filled.
   // Sudoku is solved
   // Set solve_value to true.
   #local solve_value = true;

  #else
   // Yes, there is an empty cell at 'Row', 'Col'
   // Let's try to fill it.

   // For all digit from 1 to 9
   #for (num,1,SIZE)

    // If this candidate is good for this cell put it in this cell.
    // is_valid() check that 'num' is not on the line 'Row', not in the
    // column 'Col' an not in 3x3 square which contains (Row,Col).
    #if ( is_valid(a,num,Row,Col) )
     // Put 'num' in cell [Row][Col]
     #declare a[Row][Col] = num;

     // Tests if all cells are filled
     // ! RECURSION HERE !
     #if ( Solve(board) )
      // Yes! Soduku is solved.
      // Set the return value to true
      #local solve_value = true;
      // and exit this macros
      #break
     #end // #if ( solve(board) )

     // Reset candidate 'num' in this cell
     #declare a[Row][Col] = 0;

     // the 'num' candidate is wrong
    #end // #if ( is_valid(a,num,row,col) )

    // next digit candidate
   #end // #for (num,1,SIZE)

  // look if there is an other empty cell
  #end

  // Return state of solver
  solve_value

#end
// ---------------------------------------------------------------------



I've tried to remove the recursion, but so far without success.
Either I have an infinite loop, or the resolution is not complete.



regards

-- 
kurtz le pirate
compagnie de la banquise


Post a reply to this message

Copyright 2003-2023 Persistence of Vision Raytracer Pty. Ltd.