-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.zig
103 lines (89 loc) · 2.59 KB
/
main.zig
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
const std = @import("std");
// https://github.com/ziglang/zig/blob/d2014fe9713794f6cc0830301a1110d5e92d0ff0/lib/std/debug.zig#L84C1-L84C1
pub fn print(comptime fmt: []const u8, args: anytype) void {
const stdout = std.io.getStdOut().writer();
nosuspend stdout.print(fmt, args) catch return;
}
var sudokuGrid = [_][9]u32{
[_]u32{ 0, 4, 0, 0, 0, 0, 6, 1, 2 },
[_]u32{ 0, 8, 2, 9, 0, 0, 7, 0, 4 },
[_]u32{ 0, 0, 0, 0, 0, 0, 0, 0, 0 },
[_]u32{ 0, 7, 0, 0, 0, 4, 0, 0, 0 },
[_]u32{ 0, 0, 8, 5, 0, 0, 3, 7, 0 },
[_]u32{ 0, 1, 3, 0, 0, 0, 0, 0, 0 },
[_]u32{ 0, 0, 0, 8, 0, 0, 0, 0, 0 },
[_]u32{ 0, 0, 5, 1, 0, 9, 0, 0, 0 },
[_]u32{ 7, 0, 0, 0, 4, 0, 1, 0, 0 },
};
pub fn main() void {
var i: usize = 0;
var j: usize = 0;
const solved = solve(&sudokuGrid, &i, &j);
if (solved) {
showGrid(sudokuGrid);
} else print("You failed 😛\n", .{});
}
fn step(i: *usize, j: *usize) void {
if (j.* == 8) {
j.* = 0;
i.* += 1;
return;
}
j.* += 1;
}
fn solve(grid: *[9][9]u32, i: *usize, j: *usize) bool {
// freeze the i,j of the parent function
var _i = i.*;
var _j = j.*;
while (grid[i.*][j.*] != 0) {
step(i, j);
}
var array: [9]u32 = [9]u32{ 0, 0, 0, 0, 0, 0, 0, 0, 0 };
getRow_Col(&array, grid.*, i.*, j.*);
getSubGrid(&array, grid.*, i.*, j.*);
for (array, 0..array.len) |p, idx| {
if (p == 0) {
grid[i.*][j.*] = @intCast(idx + 1);
if (i.* == 8 and j.* == 8) return true;
const solved = solve(grid, i, j);
if (solved) return true;
}
}
// step behind
grid[i.*][j.*] = 0;
i.* = _i;
j.* = _j;
return false;
}
fn showGrid(grid: [9][9]u32) void {
for (grid) |row| {
for (row) |slot| {
print("{} ", .{slot});
}
print("\n", .{});
}
}
fn getSubGrid(array: *[9]u32, grid: [9][9]u32, i: usize, j: usize) void {
const bi: usize = if (i < 3) 3 else if (i < 6 and i >= 3) 6 else 9;
const bj: usize = if (j < 3) 3 else if (j < 6 and j >= 3) 6 else 9;
for ((bi - 3)..bi) |idx| {
for ((bj - 3)..bj) |jdx| {
var num = grid[idx][jdx];
if (num != 0) {
array[num - 1] = num;
}
}
}
}
fn getRow_Col(array: *[9]u32, grid: [9][9]u32, i: usize, j: usize) void {
for (0..9, 0..9) |_i, _j| {
var num1 = grid[i][_j];
var num2 = grid[_i][j];
if (num1 != 0) {
array[num1 - 1] = num1;
}
if (num2 != 0) {
array[num2 - 1] = num2;
}
}
}