Compare commits
9 Commits
c965f65422
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| f797701718 | |||
| e974dc9171 | |||
| 21c10de9da | |||
| 088135ac32 | |||
| 4c707a0fa6 | |||
| 0453c21a3c | |||
| 8fefe103f0 | |||
| b12fff9d22 | |||
| 9c10b8efbf |
24
src/main.c
24
src/main.c
@@ -3,8 +3,30 @@
|
||||
#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_LEN] = {
|
||||
// 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, 0x020, 0x000, 0x000, 0x000, 0x004,
|
||||
0x008, 0x000, 0x000, 0x080, 0x000, 0x004, 0x000, 0x000, 0x001,
|
||||
0x040, 0x000, 0x000, 0x000, 0x002, 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);
|
||||
|
||||
for (int i = 0; i < 2; i++) {
|
||||
sudoku_solve_step(board);
|
||||
sudoku_print(board);
|
||||
}
|
||||
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
|
||||
37
src/sudoku.c
37
src/sudoku.c
@@ -9,24 +9,32 @@
|
||||
#include "util/intdef.h"
|
||||
|
||||
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];
|
||||
}
|
||||
}
|
||||
|
||||
void sudoku_place(u16 *board, 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;
|
||||
/* 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 x = idx % SUDOKU_DPT;
|
||||
uint y = idx / SUDOKU_DPT;
|
||||
|
||||
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[x + (i * SUDOKU_DPT)], val);
|
||||
setbrdpos(&brd[ibox + (SUDOKU_DPT * (i % SUDOKU_BOXLEN))], val);
|
||||
}
|
||||
}
|
||||
|
||||
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]) {
|
||||
case SUDOKU_1:
|
||||
case SUDOKU_2:
|
||||
@@ -38,14 +46,17 @@ void sudoku_solve_step(u16 *board) {
|
||||
case SUDOKU_8:
|
||||
case SUDOKU_9:
|
||||
sudoku_place(board, board[i], i);
|
||||
// printf("%i,%i\n", i % SUDOKU_DPT, i / SUDOKU_DPT);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void sudoku_print(const u16 *board) {
|
||||
for (uint i = 0; i < SUDOKU_DEPTH_2; i++) {
|
||||
printf("+———-———-———-———-———-———-———-———-———+\n");
|
||||
for (uint i = 0; i < SUDOKU_LEN; 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 +69,9 @@ void sudoku_print(const u16 *board) {
|
||||
default: tile = ' '; break;
|
||||
};
|
||||
|
||||
printf("|%c ", tile);
|
||||
printf("| %c ", tile);
|
||||
// printf("|%3X", board[i]);
|
||||
if (i % 9 == 8) printf("|\n");
|
||||
}
|
||||
printf("+———-———-———-———-———-———-———-———-———+\n");
|
||||
}
|
||||
|
||||
@@ -4,9 +4,9 @@
|
||||
|
||||
#include "util/intdef.h"
|
||||
|
||||
#define SUDOKU_DEPTH_SQRT 3
|
||||
#define SUDOKU_DEPTH (SUDOKU_DEPTH_SQRT * SUDOKU_DEPTH_SQRT)
|
||||
#define SUDOKU_DEPTH_2 (SUDOKU_DEPTH * SUDOKU_DEPTH)
|
||||
#define SUDOKU_BOXLEN 3
|
||||
#define SUDOKU_DPT 9
|
||||
#define SUDOKU_LEN (SUDOKU_DPT * SUDOKU_DPT)
|
||||
|
||||
/* bitmask */
|
||||
enum sudoku_bitmask {
|
||||
|
||||
Reference in New Issue
Block a user