#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
int tablero[9][9]={{8,0,0,4,0,6,0,0,7}, // Valores inicales del sudoku
{0,0,0,0,0,0,4,0,0,},
{0,1,0,0,0,0,6,5,0,},
{5,0,9,0,3,0,7,8,0},
{0,0,0,0,7,0,0,0,0},
{0,4,8,0,2,0,1,0,3},
{0,5,2,0,0,0,0,9,0},
{0,0,1,0,0,0,0,0,0},
{3,0,0,9,0,2,0,0,5}};
int bloqueados[9][9]; // Esta matriz y la funcion que sigue se usa para
//que el usuario no cambie los numeros iniciales
void initbloq() {
int i,j;
for (i=0;i<9;i++) {
for (j=0;j<9;j++) {
if (tablero[i][j]!=0) bloqueados[i][j]= 1;
}
}
}
void imprimeTablero() { // Despliega un tablero en pantalla, con los numeros inciales y los que vamos poniendo
int i,j, valor;
system("cls"); // Borramos la pantalla
printf (" ");
for (int i=0;i<9;i++) printf (" %c ",char(65+i)); // Letras de la "A" a la "I"
printf ("\n");
// Marco superior
printf (" %c",char(201)); // Esquina superior izquierda
for (i=0;i<27;i++) {
if (i==8 || i==17) printf ("%c",char(203)); else printf ("%c",char(205));
}
printf ("%c\n",char(187)); // Esquina superior derecha
for (i=0;i<9;i++) {
if (i==3 || i==6) { // lineas que diviran los 9 cuadrantes
printf (" %c",char(204));
for (int k=0;k<27;k++) {
if (k==8 || k==17) printf ("%c",char(206)); // Cruz
else printf ("%c",char(205)); // Dos lineas horizontales
}
printf("%c\n",char(185)); // Division
}
else if (i>0) printf (" %c %c %c %c\n",char(186),char(186),char(186),char(186));
printf(" ");
for (j=0;j<9;j++) {
valor=tablero[i][j];
if (j==0) {
printf ("%d",i+1); // Los numeros que indican cada renglon
printf ("%c",char(186)); // Dos lineas verticales
}
if (j==2 || j==5) {
if (valor==0)printf (" %c",char(186)); // Ponemos un espacio en vez de un cero mas dos lineas verticales
else printf (" %d%c",valor,char(186)); // Numeros del "1" al "9" mas dos lineas verticales
}
else {
if (valor==0) printf (" ",valor); // Ponemos un espacio en vez de un cero
else printf (" %d ",valor); // Numeros del "1" al "9"
}
}
printf ("%c\n",char(186));
}
// Marco inferior
printf (" %c",char(200)); // Esquina inferior izquierda
for (i=0;i<27;i++) {
if (i==8 || i==17) printf ("%c",char(202)); else printf ("%c",char(205));
}
printf ("%c\n",char(188)); // Esquina inferior derecha
}
bool valida(int renglon,int columna, int valor) {
int i,j,ii,jj;
// checamos renglon
for (i=0;i<9;i++) {
if (i!=columna) {
if (valor==tablero[renglon][i]) {
Beep(500,150); // Sonido para indicar numero repetido
return false;
}
}
}
// checamos columna
for (i=0;i<9;i++) {
if (i!=renglon) {
if (valor==tablero[i][columna]) {
Beep(500,150); // Sonido para indicar numero repetido
return false;
}
}
}
// Seleccionamos a que caja pertenece el numero (1-9)
if (renglon>=0 && renglon<=2) ii=0;
if (renglon>=3 && renglon<=5) ii=3;
if (renglon>=6 && renglon<=8) ii=6;
if (columna>=0 && columna<=2) jj=0;
if (columna>=3 && columna<=5) jj=3;
if (columna>=6 && columna<=8) jj=6;
// checamos cada una de las cajas
for (i=0;i<3;i++) {
for (j=0;j<3;j++) {
if (i+ii!=renglon && j+jj!=columna) {
if (valor==tablero[i+ii][j+jj]) {
Beep(500,150); // Sonido para indicar numero repetido
return false;
}
}
}
}
if (bloqueados[renglon][columna]) { // Para ver si es un numero inical
Beep(500,150);
return false;
}
return true; // Pasó las cuatro pruebas
}
bool checaVictoria() { // Solo checa si todos los lugares tienen un numero mayor a cero
int i,j;
for (i=0;i<9;i++) {
for (j=0;j<9;j++) {
if (tablero[i][j]==0) {
return false;
}
}
}
return true;
}
int main() {
char r[3]; // vector que guarda la respuesta del usuario
int renglon,columna,valor; // Variables para usar con la matriz tablero[]
bool victoria=false; // Vale true cuando resolvemos el Sudoku
initbloq(); // inicamos la matriz que guarda los numeros iniciales
while (!victoria) { // Repetimos el ciclo, mientras no ganemos
imprimeTablero(); // Actualizamos el tablero
printf ("Ingresa una columna, un renglon y un nuevo valor, ejemplo A11: "); // Imprimimos un mensaje explicativo
scanf ("%s",r); // Leemos la entrada del usuario
if (r[0]!=NULL && r[1]!=NULL && r[2]!=NULL && // Checamos que se ingresen tres caracteres
(r[0]>=65 && r[0]<=73 || r[0]>=97 && r[0]<=105) && // Checamos que se ingrese una letra de la
//"A" a la "I" mayuscula o minuscula
r[1]>=49 && r[1]<=57 && r[2]>=49 && r[2]<=57) { // Checamos que se ingresen solo numeros del 1 al 9
columna=r[0]-65; // Restamos 65 del codigo ascii del vector, para obtener 0-9
renglon=r[1]-49; // Restamos 49 del codigo ascii del vector, para obtener del 0 al 9
valor=r[2]-48; // Restamos 48 del codigo ascii del vector, para obtener 1-8
if (columna>9) columna=columna-32; // Si la columna es minuscula la convertimos a
// mayuscula restandole 32 a su codigo ascii
if (valida(renglon, columna, valor)) // Checamos si el numero no esta repetido
tablero[renglon][columna]=valor; // Si no, lo asignamos en la matriz
if (checaVictoria()) victoria=true; // Checamos si terminamos el tablero, si no, repetimos el ciclo
}
else Beep(500,150); // Se escucha un sonido de error
}
printf ("Ganaste.");
system("pause");
}