/* ************************************************************************** */ /* */ /* ::: :::::::: */ /* Untitled-1.c :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: dkrkalic +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2026/02/04 15:54:56 by dkrkalic #+# #+# */ /* Updated: 2026/02/05 23:07:26 by dkrkalic ### ########.fr */ /* */ /* ************************************************************************** */ #include #define SIZE 4 void ft_putstr(char *str) { while (*str) write(1, str++, 1); } void ft_putchar(char c) { write(1, &c, 1); } int parse_clues(char *input, int clues[16]) { int i; i = 0; while (*input && i < 16) { if (*input == ' ') input++; else if (*input >= '1' && *input <= '4') { clues[i] = *input - '0'; i++; input++; } else return (0); } if (i != 16 || *input) return (0); return (1); } int is_unique(int grid[SIZE][SIZE], int row, int col, int num) { int i; i = 0; while (i < SIZE) { if (grid[row][i] == num || grid[i][col] == num) return (0); i++; } return (1); } int check_line(int grid[SIZE][SIZE], int clues[16], int dir, int idx) { int max; int vis; int i; max = 0; vis = 0; i = (dir % 2 == 0) ? 0 : SIZE - 1; while (i >= 0 && i < SIZE) { if ((dir < 2 && grid[idx][i] > max) || (dir > 1 && grid[i][idx] > max)) { max = (dir < 2) ? grid[idx][i] : grid[i][idx]; vis++; } i += (dir % 2 == 0) ? 1 : -1; } if (dir == 0) return (vis == clues[8 + idx]); if (dir == 1) return (vis == clues[12 + idx]); if (dir == 2) return (vis == clues[idx]); return (vis == clues[4 + idx]); } int check_all(int grid[SIZE][SIZE], int clues[16]) { int i; i = 0; while (i < SIZE) { if (!check_line(grid, clues, 0, i) || !check_line(grid, clues, 1, i) || !check_line(grid, clues, 2, i) || !check_line(grid, clues, 3, i)) return (0); i++; } return (1); } int solve(int grid[SIZE][SIZE], int clues[16], int pos) { int row; int col; int n; if (pos == SIZE * SIZE) return (check_all(grid, clues)); row = pos / SIZE; col = pos % SIZE; n = 1; while (n <= SIZE) { if (is_unique(grid, row, col, n)) { grid[row][col] = n; if (solve(grid, clues, pos + 1)) return (1); grid[row][col] = 0; } n++; } return (0); } void print_grid(int grid[SIZE][SIZE]) { int r; int c; r = 0; while (r < SIZE) { c = 0; while (c < SIZE) { ft_putchar(grid[r][c] + '0'); if (c < SIZE - 1) ft_putchar(' '); c++; } ft_putchar('\n'); r++; } } int main(int argc, char **argv) { int grid[SIZE][SIZE]; int clues[16]; int r; int c; r = 0; while (r < SIZE) { c = 0; while (c < SIZE) { grid[r][c] = 0; c++; } r++; } if (argc != 2 || !parse_clues(argv[1], clues)) ft_putstr("Error\n"); else if (solve(grid, clues, 0)) print_grid(grid); else ft_putstr("Error\n"); return (0); }