Compare commits

...

6 Commits

3 changed files with 27 additions and 28 deletions

View File

@@ -7,14 +7,14 @@
int main(int argc, char **argv) { int main(int argc, char **argv) {
(void)argc, (void)argv; (void)argc, (void)argv;
u16 board[SUDOKU_DEPTH_2] = { u16 board[SUDOKU_LEN] = {
// clang-format off // clang-format off
0x010, 0x004, 0x000, 0x000, 0x040, 0x000, 0x000, 0x000, 0x000, 0x010, 0x004, 0x000, 0x000, 0x040, 0x000, 0x000, 0x000, 0x000,
0x020, 0x000, 0x000, 0x001, 0x100, 0x010, 0x000, 0x000, 0x000, 0x020, 0x000, 0x000, 0x001, 0x100, 0x010, 0x000, 0x000, 0x000,
0x000, 0x100, 0x080, 0x000, 0x000, 0x000, 0x000, 0x020, 0x000, 0x000, 0x100, 0x080, 0x000, 0x000, 0x000, 0x000, 0x020, 0x000,
0x080, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x004, 0x080, 0x000, 0x000, 0x000, 0x020, 0x000, 0x000, 0x000, 0x004,
0x008, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x001, 0x008, 0x000, 0x000, 0x080, 0x000, 0x004, 0x000, 0x000, 0x001,
0x040, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x020, 0x040, 0x000, 0x000, 0x000, 0x002, 0x000, 0x000, 0x000, 0x020,
0x000, 0x020, 0x000, 0x000, 0x000, 0x000, 0x002, 0x080, 0x000, 0x000, 0x020, 0x000, 0x000, 0x000, 0x000, 0x002, 0x080, 0x000,
0x000, 0x000, 0x000, 0x008, 0x001, 0x100, 0x000, 0x000, 0x010, 0x000, 0x000, 0x000, 0x008, 0x001, 0x100, 0x000, 0x000, 0x010,
0x000, 0x000, 0x000, 0x000, 0x080, 0x000, 0x000, 0x040, 0x100, 0x000, 0x000, 0x000, 0x000, 0x080, 0x000, 0x000, 0x040, 0x100,
@@ -22,16 +22,11 @@ int main(int argc, char **argv) {
}; };
sudoku_init(board); sudoku_init(board);
sudoku_print(board); sudoku_print(board);
for (int i = 0; i < 2; i++) {
sudoku_solve_step(board); sudoku_solve_step(board);
sudoku_print(board); sudoku_print(board);
sudoku_solve_step(board); }
sudoku_print(board);
sudoku_solve_step(board);
sudoku_print(board);
sudoku_solve_step(board);
sudoku_print(board);
sudoku_solve_step(board);
sudoku_print(board);
return EXIT_SUCCESS; return EXIT_SUCCESS;
} }

View File

@@ -9,7 +9,7 @@
#include "util/intdef.h" #include "util/intdef.h"
void sudoku_init(u16 *board) { void sudoku_init(u16 *board) {
for (uint i = 0; i < SUDOKU_DEPTH_2; i++) { for (uint i = 0; i < SUDOKU_LEN; i++) {
board[i] |= SUDOKU_ALL & -!board[i]; board[i] |= SUDOKU_ALL & -!board[i];
} }
} }
@@ -20,18 +20,21 @@ static inline void setbrdpos(u16 *brd, u16 val) {
} }
void sudoku_place(u16 *brd, u16 val, uint idx) { void sudoku_place(u16 *brd, u16 val, uint idx) {
uint icol = idx % SUDOKU_DEPTH; uint x = idx % SUDOKU_DPT;
uint irow = idx - icol; uint y = idx / SUDOKU_DPT;
uint ibox = idx - (idx % SUDOKU_DEPTH_SQRT);
for (uint i = 0; i < SUDOKU_DEPTH; i++) { uint irow = idx - x;
uint ibox = SUDOKU_DPT * (y % SUDOKU_BOXLEN) + SUDOKU_BOXLEN * (x % SUDOKU_BOXLEN);
for (uint i = 0; i < SUDOKU_DPT; i++) {
setbrdpos(&brd[irow + i], val); setbrdpos(&brd[irow + i], val);
setbrdpos(&brd[icol + (i * SUDOKU_DEPTH)], val); setbrdpos(&brd[x + (i * SUDOKU_DPT)], val);
setbrdpos(&brd[ibox + (i / SUDOKU_DEPTH_SQRT * SUDOKU_DEPTH) + (i % SUDOKU_DEPTH_SQRT)], val); setbrdpos(&brd[ibox + (SUDOKU_DPT * (i % SUDOKU_BOXLEN))], val);
} }
} }
void sudoku_solve_step(u16 *board) { void sudoku_solve_step(u16 *board) {
for (uint i = 0; i < SUDOKU_DEPTH_2; i++) { for (uint i = 0; i < SUDOKU_LEN; i++) {
switch (board[i]) { switch (board[i]) {
case SUDOKU_1: case SUDOKU_1:
case SUDOKU_2: case SUDOKU_2:
@@ -43,16 +46,17 @@ void sudoku_solve_step(u16 *board) {
case SUDOKU_8: case SUDOKU_8:
case SUDOKU_9: case SUDOKU_9:
sudoku_place(board, board[i], i); sudoku_place(board, board[i], i);
// printf("%i,%i\n", i % SUDOKU_DPT, i / SUDOKU_DPT);
} }
} }
} }
void sudoku_print(const u16 *board) { void sudoku_print(const u16 *board) {
printf("+———-———-———-———-———-———-———-———-———+\n"); printf("+———-———-———-———-———-———-———-———-———+\n");
for (uint i = 0; i < SUDOKU_DEPTH_2; i++) { for (uint i = 0; i < SUDOKU_LEN; i++) {
char tile; char tile;
switch (board[i]) { switch (board[i]) {
case 0: tile = 'x'; break; // case 0: tile = 'x'; break;
case SUDOKU_1: tile = '1'; break; case SUDOKU_1: tile = '1'; break;
case SUDOKU_2: tile = '2'; break; case SUDOKU_2: tile = '2'; break;
case SUDOKU_3: tile = '3'; break; case SUDOKU_3: tile = '3'; break;
@@ -66,7 +70,7 @@ void sudoku_print(const u16 *board) {
}; };
printf("| %c ", tile); printf("| %c ", tile);
// printf("|%3i", board[i]); // printf("|%3X", board[i]);
if (i % 9 == 8) printf("|\n"); if (i % 9 == 8) printf("|\n");
} }
printf("+———-———-———-———-———-———-———-———-———+\n"); printf("+———-———-———-———-———-———-———-———-———+\n");

View File

@@ -4,9 +4,9 @@
#include "util/intdef.h" #include "util/intdef.h"
#define SUDOKU_DEPTH_SQRT 3 #define SUDOKU_BOXLEN 3
#define SUDOKU_DEPTH (SUDOKU_DEPTH_SQRT * SUDOKU_DEPTH_SQRT) #define SUDOKU_DPT 9
#define SUDOKU_DEPTH_2 (SUDOKU_DEPTH * SUDOKU_DEPTH) #define SUDOKU_LEN (SUDOKU_DPT * SUDOKU_DPT)
/* bitmask */ /* bitmask */
enum sudoku_bitmask { enum sudoku_bitmask {