This is just a stream of thought blog post as I’m coding a Sudoku solving program. I’m a beginner coder, so the code won’t be the best, but I’m learning as I go.
Click here to see the first post
Last thing I said the the last post was to use 3 digits to reference the cell. A short thought later and I’m thinking 4 would be easier.
[column][row][cell number in sub-grid][sub-grid]
Why 4?
- I can query a row by looping through the column number
- I can query a column by looping through the row number
- I can check for a unique entry in a single sub-grid
- Cell number will come in to play when solving more complex puzzles
Sounds simple right? I’m writing this after I’ve done the work.
There are 2 ways to do this. A straight up 9×9 grid. The row and column numbers are easy. Adding in a sub-grid number and a cell number would make it a bit harder.
I ended up working out the logic by working on the smallest component, a cell, then building a 3×3 sub-grid (calling the cell function for each cell), then finally building the entirety of the grid.
Below is what I ended up coding. I know they say good code can be read well and doesn’t need comments. Below has a comment for almost every line.
<?php $grid = "<table border='2'>\n"; // Grid table // Set working variables $subgrid_number=1; // 1-9 sub-grids $cell_working=1; // 1-9 cells per sub-grid $x_start=1; // Setting outside of loop for initial value $y_start=1; // Setting outside of loop for initial value for($a = 1; $a <=3; $a++){ $grid .= " <tr>\n"; // Start sub-grid row for($b = 1; $b <=3; $b++){ // Each loop builds a row of 3 sub-grids $grid .= build_one_subgrid($x_start,$y_start); $subgrid_number++; // After each sub-grid is created, increase number $x_start = $x_start+3; // In the sub-grid loop, x starts at 1,3,7 } $grid .= " </tr>\n"; // End sub-grid row $y_start = $y_start+3; // Set next set of y_starts to 3 for the sub-grid row $x_start=1; // Set x_start back to 1 as the colums start again } $grid .= "</table></td>\n"; // End Grid table // build_one_subgrid - used to build a 9x9 sub-grid // $x_start = Starting column // $y_start = Starting row function build_one_subgrid($x_start,$y_start){ global $grid; // So we can add to the grid output global $subgrid_number; // Sub-grid number to add to table $cell_working = 1; // Start value for cell $x_working = $x_start; // Using a working variable to build subgrid $y_working = $y_start; // Using a working variable to build subgrid $grid .= " <td><table border='1'>\n"; //Starting sub-grid table for($a = 1; $a <=3; $a++){ // Loop for row $grid .= " <tr>\n"; for($b = 1; $b <=3; $b++){ // Loop for column $grid .= build_cell($x_working,$y_working,$cell_working,$subgrid_number); $cell_working++; // Increase cell_working (rest next time it's run) $x_working++; // Increase column number } $x_working = $x_start; // Colums in one sub-grid all start at the same number $y_working++; // Increase row number $grid .= " </tr>\n"; } $grid .= " </td></table>\n"; //End sub-grid table } // build_cell - code to build a single cell // $x - column number // $y - row number // $cellno - cell number // $subgrid_number - sub-gridnumber function build_cell($x,$y,$cellno,$subgrid_number){ return " <td><input type='text' name='$x$y$cellno$subgrid_number' size='4' value='$x$y$cellno$subgrid_number'></input></td>\n"; } echo $grid; ?>
Produces this output:
Next ‘Session’ – Entering a puzzle to be solved.