Você está na página 1de 3

#include <stdio.

h>
#include <stdbool.h>

#define N 3
#define SIZE (N * N)

// Função para imprimir o tabuleiro


void imprimirTabuleiro(int tabuleiro[SIZE][SIZE]) {
for (int i = 0; i < SIZE; i++) {
for (int j = 0; j < SIZE; j++) {
printf("%2d ", tabuleiro[i][j]);
}
printf("\n");
}
printf("\n");
}

// Função para verificar se é seguro inserir um número em uma determinada posição


bool ehSeguro(int tabuleiro[SIZE][SIZE], int linha, int coluna, int numero) {
// Verifica se o número já está presente na mesma linha ou coluna
for (int i = 0; i < SIZE; i++) {
if (tabuleiro[linha][i] == numero || tabuleiro[i][coluna] == numero) {
return false;
}
}

// Verifica se o número já está presente no mesmo sub-tabuleiro


int inicioLinha = linha - (linha % N);
int inicioColuna = coluna - (coluna % N);
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
if (tabuleiro[inicioLinha + i][inicioColuna + j] == numero) {
return false;
}
}
}

return true; // Número seguro para ser inserido


}

// Função de backtracking para resolver o Sudoku


bool resolverSudoku(int tabuleiro[SIZE][SIZE]) {
int linha = -1;
int coluna = -1;
bool haCelulaVazia = false;

// Encontra a próxima célula vazia


for (int i = 0; i < SIZE; i++) {
for (int j = 0; j < SIZE; j++) {
if (tabuleiro[i][j] == 0) {
linha = i;
coluna = j;
haCelulaVazia = true;
break;
}
}
if (haCelulaVazia) {
break;
}
}

// Se não há mais células vazias, o Sudoku foi resolvido


if (!haCelulaVazia) {
return true;
}

// Testa números de 1 a 9 em uma célula vazia


for (int numero = 1; numero <= SIZE; numero++) {
if (ehSeguro(tabuleiro, linha, coluna, numero)) {
tabuleiro[linha][coluna] = numero;

if (resolverSudoku(tabuleiro)) {
return true; // Sudoku resolvido
}

tabuleiro[linha][coluna] = 0; // Desfaz a atribuição e tenta com o


próximo número
}
}

return false; // Não há solução para o Sudoku


}

int main() {
int tabuleiro[SIZE][SIZE] = {
{ 5, 3, 0, 0, 7, 0, 0, 0, 0 },
{ 6, 0, 0, 1, 9, 5, 0, 0, 0 },
{ 0, 9, 8, 0, 0, 0, 0, 6, 0 },
{ 8, 0, 0, 0, 6, 0, 0, 0, 3 },
{ 4, 0, 0, 8, 0, 3, 0, 0, 1 },
{ 7, 0, 0, 0, 2, 0, 0, 0, 6 },
{ 0, 6, 0, 0, 0, 0, 2, 8, 0 },
{ 0, 0, 0, 4, 1, 9, 0, 0, 5 },
{ 0, 0, 0, 0, 8, 0, 0, 7, 9 }
};

printf("Tabuleiro inicial:\n");
imprimirTabuleiro(tabuleiro);

if (resolverSudoku(tabuleiro)) {
printf("Sudoku resolvido:\n");
imprimirTabuleiro(tabuleiro);
} else {
printf("Não há solução para o Sudoku.\n");
}

return 0;
}

Você também pode gostar