rush1
/* ************************************************************************** */
/*                                                                            */
/*                                                        :::      ::::::::   */
/*   Untitled-1.c                                       :+:      :+:    :+:   */
/*                                                    +:+ +:+         +:+     */
/*   By: dkrkalic <dkrkalic@student.42.fr>          +#+  +:+       +#+        */
/*                                                +#+#+#+#+#+   +#+           */
/*   Created: 2026/02/04 15:54:56 by dkrkalic          #+#    #+#             */
/*   Updated: 2026/02/05 23:07:26 by dkrkalic         ###   ########.fr       */
/*                                                                            */
/* ************************************************************************** */
 
#include <unistd.h>
 
#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);
}