Compare commits
3 Commits
c965f65422
...
8fefe103f0
| Author | SHA1 | Date | |
|---|---|---|---|
| 8fefe103f0 | |||
| b12fff9d22 | |||
| 9c10b8efbf |
29
src/main.c
29
src/main.c
@@ -3,8 +3,35 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "sudoku.h"
|
||||
|
||||
int main(int argc, char **argv) {
|
||||
(void)argc, (void)argv;
|
||||
printf("%s\n", "Hello, World!");
|
||||
u16 board[SUDOKU_DEPTH_2] = {
|
||||
// clang-format off
|
||||
0x010, 0x004, 0x000, 0x000, 0x040, 0x000, 0x000, 0x000, 0x000,
|
||||
0x020, 0x000, 0x000, 0x001, 0x100, 0x010, 0x000, 0x000, 0x000,
|
||||
0x000, 0x100, 0x080, 0x000, 0x000, 0x000, 0x000, 0x020, 0x000,
|
||||
0x080, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x004,
|
||||
0x008, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x001,
|
||||
0x040, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x020,
|
||||
0x000, 0x020, 0x000, 0x000, 0x000, 0x000, 0x002, 0x080, 0x000,
|
||||
0x000, 0x000, 0x000, 0x008, 0x001, 0x100, 0x000, 0x000, 0x010,
|
||||
0x000, 0x000, 0x000, 0x000, 0x080, 0x000, 0x000, 0x040, 0x100,
|
||||
// clang-format on
|
||||
};
|
||||
sudoku_init(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);
|
||||
sudoku_solve_step(board);
|
||||
sudoku_print(board);
|
||||
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
|
||||
19
src/sudoku.c
19
src/sudoku.c
@@ -14,14 +14,19 @@ void sudoku_init(u16 *board) {
|
||||
}
|
||||
}
|
||||
|
||||
void sudoku_place(u16 *board, u16 val, uint idx) {
|
||||
/* removes `val` from `*brd`, if `*brd` is not equal to `val` */
|
||||
static inline void setbrdpos(u16 *brd, u16 val) {
|
||||
*brd &= ~(val & -(*brd != val));
|
||||
}
|
||||
|
||||
void sudoku_place(u16 *brd, u16 val, uint idx) {
|
||||
uint icol = idx % SUDOKU_DEPTH;
|
||||
uint irow = idx - icol;
|
||||
uint ibox = idx - (idx % SUDOKU_DEPTH_SQRT);
|
||||
for (uint i = 0; i < SUDOKU_DEPTH; i++) {
|
||||
board[irow + i] &= ~val;
|
||||
board[icol + (i * SUDOKU_DEPTH)] &= ~val;
|
||||
board[ibox + (i / SUDOKU_DEPTH_SQRT * SUDOKU_DEPTH) + (i % SUDOKU_DEPTH_SQRT)] &= ~val;
|
||||
setbrdpos(&brd[irow + i], val);
|
||||
setbrdpos(&brd[icol + (i * SUDOKU_DEPTH)], val);
|
||||
setbrdpos(&brd[ibox + (i / SUDOKU_DEPTH_SQRT * SUDOKU_DEPTH) + (i % SUDOKU_DEPTH_SQRT)], val);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -43,9 +48,11 @@ void sudoku_solve_step(u16 *board) {
|
||||
}
|
||||
|
||||
void sudoku_print(const u16 *board) {
|
||||
printf("+———-———-———-———-———-———-———-———-———+\n");
|
||||
for (uint i = 0; i < SUDOKU_DEPTH_2; i++) {
|
||||
char tile;
|
||||
switch (board[i]) {
|
||||
case 0: tile = 'x'; break;
|
||||
case SUDOKU_1: tile = '1'; break;
|
||||
case SUDOKU_2: tile = '2'; break;
|
||||
case SUDOKU_3: tile = '3'; break;
|
||||
@@ -58,7 +65,9 @@ void sudoku_print(const u16 *board) {
|
||||
default: tile = ' '; break;
|
||||
};
|
||||
|
||||
printf("|%c ", tile);
|
||||
printf("| %c ", tile);
|
||||
// printf("|%3i", board[i]);
|
||||
if (i % 9 == 8) printf("|\n");
|
||||
}
|
||||
printf("+———-———-———-———-———-———-———-———-———+\n");
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user