// Solucionador de sudokus con backtracking.
//
// Un NODO es una llamada a la función recursiva, y se cuenta al entrar, incluida la primera.
// Para que dos soluciones correctas cuenten lo mismo, las dos búsquedas siguen estas reglas:
//   - Prueban los dígitos de 1 a 9, y hacen la llamada recursiva solo si can_place lo permite.
//   - Se detienen en la primera solución.
#ifndef SOLVER_H
#define SOLVER_H

#include "board.h"

// Devuelve 1 si digit no está en la fila, en la columna ni en la caja de (row, col).
// La celda (row, col) debe estar vacía.
int can_place(const Board *board, int row, int col, int digit);

// Devuelve cuántos dígitos, de 1 a 9, se pueden poner en la celda vacía (row, col).
int count_options(const Board *board, int row, int col);

// Las dos búsquedas reciben un tablero sin repetidos (board_is_legal) y dejan en *nodes
// los nodos visitados. Devuelven 1 si hay solución, y la dejan en *board. Si no hay,
// devuelven 0 y *board queda igual que al inicio.

// Llena siempre la primera celda vacía en orden de lectura: fila por fila, de izquierda a derecha.
int solve_in_order(Board *board, long *nodes);

// Llena siempre la celda vacía con menos opciones. En un empate, la primera en orden de lectura.
int solve_fewest_options(Board *board, long *nodes);

#endif
