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 <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#include "sudoku.h"
|
||||||
|
|
||||||
int main(int argc, char **argv) {
|
int main(int argc, char **argv) {
|
||||||
(void)argc, (void)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;
|
return EXIT_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|||||||
35
src/sudoku.c
35
src/sudoku.c
@@ -9,24 +9,32 @@
|
|||||||
#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];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void sudoku_place(u16 *board, u16 val, uint idx) {
|
/* removes `val` from `*brd`, if `*brd` is not equal to `val` */
|
||||||
uint icol = idx % SUDOKU_DEPTH;
|
static inline void setbrdpos(u16 *brd, u16 val) {
|
||||||
uint irow = idx - icol;
|
*brd &= ~(val & -(*brd != val));
|
||||||
uint ibox = idx - (idx % SUDOKU_DEPTH_SQRT);
|
}
|
||||||
for (uint i = 0; i < SUDOKU_DEPTH; i++) {
|
|
||||||
board[irow + i] &= ~val;
|
void sudoku_place(u16 *brd, u16 val, uint idx) {
|
||||||
board[icol + (i * SUDOKU_DEPTH)] &= ~val;
|
uint x = idx % SUDOKU_DPT;
|
||||||
board[ibox + (i / SUDOKU_DEPTH_SQRT * SUDOKU_DEPTH) + (i % SUDOKU_DEPTH_SQRT)] &= ~val;
|
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) {
|
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:
|
||||||
@@ -38,14 +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) {
|
||||||
for (uint i = 0; i < SUDOKU_DEPTH_2; i++) {
|
printf("+———-———-———-———-———-———-———-———-———+\n");
|
||||||
|
for (uint i = 0; i < SUDOKU_LEN; i++) {
|
||||||
char tile;
|
char tile;
|
||||||
switch (board[i]) {
|
switch (board[i]) {
|
||||||
|
// 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;
|
||||||
@@ -59,6 +70,8 @@ void sudoku_print(const u16 *board) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
printf("| %c ", tile);
|
printf("| %c ", tile);
|
||||||
|
// printf("|%3X", board[i]);
|
||||||
if (i % 9 == 8) printf("|\n");
|
if (i % 9 == 8) printf("|\n");
|
||||||
}
|
}
|
||||||
|
printf("+———-———-———-———-———-———-———-———-———+\n");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
Reference in New Issue
Block a user