-
Notifications
You must be signed in to change notification settings - Fork 0
/
Untitled1.c
115 lines (102 loc) · 3.33 KB
/
Untitled1.c
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
104
105
106
107
108
109
110
111
112
113
114
115
#include <stdio.h>
#include <stdlib.h>
int contador=0;//variavel global para contar o numero de chamadas no backtracking
int tabuleiro[9][9] = {//tabuleiro de entrada para resolução
{0,0,0,0,0,0,4,5,6},
{0,0,0,0,0,0,0,0,0},
{0,5,0,0,4,6,0,9,2},
{2,8,0,7,0,0,0,0,3},
{6,0,0,0,1,0,5,0,0},
{0,0,0,0,0,8,0,0,0},
{0,0,0,0,0,0,3,0,0},
{8,0,0,9,0,4,6,0,0},
{0,2,0,8,0,0,0,0,1}
};
//função responsavel por imprimir o tabuleiro
int imprimirTabuleiro(int tabuleiro[9][9]){
int i,j;
for(i = 0;i < 9;i++){
for(j = 0;j < 9;j++){
printf("%d ",tabuleiro[i][j]);
}
printf("\n");
}
}
//função responsável por encontrar as posições vazias no tabuleiro
int Encontrar0(int tabuleiro[9][9],int *linha,int *coluna){
for(*linha = 0;*linha < 9;(*linha)++){
for(*coluna = 0;*coluna < 9;(*coluna)++){
if(tabuleiro[*linha][*coluna] == 0)
return 1;
}
}
return 0;
}
//função responsavel por percorrer as linhas e conferir
int ConfereLinha(int tabuleiro[9][9],int linha,int numero){
int i;
for(i = 0;i < 9;i++){
if(tabuleiro[linha][i] == numero)
return 1;
}
return 0;
}
//função responsavel por percorrer as colunas e conferir
int ConfereColuna(int tabuleiro[9][9],int coluna,int numero){
int i;
for(i = 0;i < 9;i++){
if(tabuleiro[i][coluna] == numero)
return 1;
}
return 0;
}
//função responsavel por percorrer ao pequeno quadro e conferir
int Confere3x3Bloco(int tabuleiro[9][9],int Ilinha,int Icol,int numero){
int i,j;
for(i = 0;i<3;i++){
for(j = 0;j<3;j++){
if(tabuleiro[i+Ilinha][j+Icol] == numero)
return 1;
}
}
return 0;
}
//função resposavel por garantir as regras do jogo chamando a conferelinha,conferecoluna e confere3X3Bloco
int ChamadaConfere(int tabuleiro[9][9],int linha,int coluna,int numero){
if(ConfereLinha(tabuleiro,linha,numero) == 0 && ConfereColuna(tabuleiro,coluna,numero) == 0 &&
Confere3x3Bloco(tabuleiro,(linha - linha%3),(coluna - coluna%3),numero) == 0) {
return 1;
}
return 0;
}
//função responsavel por resolver recursivamente o jogo,utilizando backtracking
int Resolve(int tabuleiro[9][9]){
int linha,coluna;
if(Encontrar0(tabuleiro,&linha,&coluna) == 0)
return 1;
int numero;
for(numero = 1;numero <= 9;numero++){
if(ChamadaConfere(tabuleiro,linha,coluna,numero) == 1){
tabuleiro[linha][coluna] = numero;
if(Resolve(tabuleiro) == 1){
contador++;
return 1;
//backtrack
}
tabuleiro[linha][coluna] = 0;
}
}
return 0;
}
int main()
{
printf("Jogo de entrada:\n\n");
imprimirTabuleiro(tabuleiro);
printf("\n\n\n");
printf("Jogo Resolvido:\n\n");
if(Resolve(tabuleiro) == 1)
imprimirTabuleiro(tabuleiro);
printf("\n\nNumero de trocas (chamadas backtracking) %d",contador);
printf("\n\n\n");
return 0;
}