¿Cómo se programa la calculadora de Sudoku?
Rellena los espacios en blanco con espacios (subraya cada vez)
Se puede ingresar por archivo (abre el archivo con un programa compilado) o por teclado.
Compile con Turbo Pascal con parche CRT o utilice Free Pascal (no se garantiza que funcione correctamente)
El tiempo de espera de la muestra no se agota, pero puede que se agote el tiempo de espera para datos especiales (Aún no tengo los datos, es demasiado simple para escribirlo usted mismo, pero los datos especiales básicamente no excederán 0,01 s)
El programa es el siguiente:
programa sdjsq; {solucionador de sudokus}
{-------------Llamar a la biblioteca-------------------- -------------- ------------------USOS}
usa CRT, Dos {usa CRT Dos; biblioteca}
{----- --------Definición de tipo de datos--------------------------------- --------------- ---TYPE}
tipo
sz=0..9; {número, el sublímite del tipo de byte; ocupa un byte}
sy=1.9; {igual que sz}
sd=array
para i:=1 a 9 hazlo si. ilt;gt;x entonces s:=s-[a[i , y]];
para i:=1 a 9 hazlo si ilt;gt;y entonces s:=s-[a[ x,i]];
for i:=1 a 3 hacer para j:=1 a 3 hacer
if ((x-1)div 3*3 ilt; gt ; x) y ((y-1)div 3*3 jlt ;gt;y)
entonces s:=s-[a[(x-1)div 3*3 i, (y- 1)div 3*3 j]];
s:=s-[0]
fin
{======= =======Imprimir datos======= ==================================== ==PRINT}
procedimiento print( xn, yn, color: byte);
comenzar
gotoxy(2*xn, 2*yn); /p>
textcolor(color);
textbackground(5 ord(not ((x=xn)y(y=yn)))*(-4-ord(((xn-1) ) div 3 (yn-1) div 3) mod 2= 0)));
si a[xn, yn]lt 0 entonces escribe(a[xn, yn]) else escribe; (#32);
gotoxy( 1, 1);
fin
{============== Leer datos usando el teclado========== =================ENTRADA POR TECLADO}
procedimiento inputbkb(var a:sd
etiqueta 1;
var
xi, yi: byte; >s: ss; i: byte;
comenzar
printk;
fillchar(a, tamaño de(a), x:=1; y:=1; imprimir(1, 1, 0);
tcolor(15); textbackground(0);
s:=[1..9];gotoxy(1,20); para i:=1 a 9 escriba(i:2); /p>
repetir
c:=readkey;
xi:=x;yi:=y
caso c de
;(*#13{Entrar}, #27{Esc}*)
#27:detener
(*#72{Arriba}, #75{Izquierda} , #77{Derecha}, #80{Abajo}*)
#0: comenzar
c:=readkey
caso c de
#75: si xlt; gt; 1 entonces x: = x-1 else write('');
#72: si ylt; else write('');
#80: si ylt; 9 entonces y: =y 1 else write(''); ; 9 entonces x: =x 1 else write('');
#83: a[x, y]: =0
end; >end;
#48..#58: si (ord(c)-48 en s) o (c=#48)
entonces a[x, y]: =ord(c)-48 else write('');
end;
print(xi, yi, 12); p>
end p>
ky(a, x, y, s);
gotoxy(1, 20);
textcolor(15); 0); delline;
para i:=1 a 9, hazlo si i en s y luego escribe(i:2
hasta c=#13; p>x:=0 ; y:=0; print(xi, yi, 12);
fin
procedimiento
comenzar
p>
gotoxy (1, 20);
textfondo(0); textcolor(143);
escribir('¡Sin respuesta!'); >
readkey;
detener
fin
{=============Leer datos del archivo= ===== =========================ENTRADA POR ARCHIVO}
procedimiento inputbf(var a: sd; const ruta: cadena);
función Existe(Ruta: cadena): boolean
var
S: PathStr
begin
S:= FSearch(Ruta, GetEnv(''));
Exist:= S lt;gt ''; >
var
>x, y: byte;
c: char;
f: texto
comenzar
si no existe (ruta) luego comience
inputbkb(a);
fin si no comienza
assign(f, ruta); p>para y:=1 a 9 comienza
para x:=1 a 9 comienza
read(f,c
si no (c en [#48..#58, #32]) luego comienza
inputbkb(a); #32 entonces a[x, y]:=0 else a[x, y]:=ord(c)-48; print(x, y, 12);
readln(f);
fin
fin;
fin
{======= ======Completar datos fijos========================================= == ====TC}
procedimiento tc;
var
x, y, i, t, n, f: byte; >
s: ss;
función tct: byte;
var
i, j, k, l: byte
s1, s2, s3: ss;
n1, n2, n3: matriz [1..9] de byte;
comienzo
tct: =0 ;
para i:=1 a 9 comienzan
fillchar(n1, sizeof(n1), 0); fillchar( n2, sizeof(n2), 0);
for j:=1 a 9 comienza
ky(a, i, j, s); , j ]lt; gt; 0 luego comienza s:=[a[i,j]]; n1[a[i,j]]:=10; 9 hacer si k en s entonces si n1[k]=0 entonces n1[k]:=j else n1[k]:=10
ky(a,j,i,s);if a[ j, i]lt; gt; 0 luego comienza s: =[a[j, i]]; n2[a[j, i]]: =10; =1 a 9 hacer si k en s entonces si n2[k]=0 entonces n2[k]:=j else n2[k]:=10
ky(a,((i-1; ) mod 3)*3 ((j-1) mod 3 1), ((i-1) div 3)*3 ((j-1) div 3 1),
if); a[ ((i-1) mod 3)*3 ((j-1) mod 3 1), ((i-1) div 3)*3 ((j-1) div 3 1)]lt;gt; 0 entonces comienza
s:=[a[((i-1) mod 3)*3 ((j-1) mod 3 1), ((i-1) div 3)*3 ((j- 1) div 3 1)]];
n3[a[((i-1) mod 3)*3 ((j-1) mod 3 1), ((i-1) div 3 )*3 ((j-1) div 3 1)]]:=10
end;
para k:=1 a 9 haz si k en s entonces si n3 [k]=0 entonces n3[k]:=j else n3[k]:=10
fin
para k:=1 a 9 comenzar
j:=n1[k];
si j en [1..9] entonces comienza
a[i, j]:=k; , j, 6); tct:=1; salir;
fin;
fin
para k:=1 a 9 comenzar
j:=n2[k];
si j en [1..9] entonces comienza
a[j, i]:=k; , i, 6); tct:=1; salir;
finalizar
finalizar
para k:=1 a 9 comenzar
j:=n3[k];
si j en [1..9] entonces comienza
a[((i-1) mod 3)*3 ((j-1) mod 3 1), ((i-1) div 3)*3 ((j-1) div 3 1)]:=k
print(((i-; 1) mod 3)*3 ((j-1) mod 3 1), ((i-1) div 3)*3 ((j-1) div 3 1), 6); tct:=1;
final;
final;
final; verificación de procedimiento;
var
i, j, k: byte;
s, s1, s2, s3: ss; comenzar
para i:=1 a 9 comenzar
s1:=[] s2:=[]; j:=1 a 9 comienzan
si a[i,j]=0 entonces comienzan ky(a,i,j,s);s1:=s1 s; fin else s1:=s1 [ a[i, j]];
si a[j, i]=0 entonces comienza ky(a, j, i, s); a[j, i]];
si a[((i-1) mod 3)*3 ((j-1) mod 3 1), ((i-1) div 3)* 3 ((j-1) div 3 1)]=0 luego comienza
ky(a, ((i-1) mod 3)*3 ((j-1) mod 3 1), ( (i-1) div 3)*3 ((j-1) div 3 1), s3:=s3 s
end else s3);
:=s3 [a[((i-1) mod 3)*3 ((j-1) mod 3 1), ((i-1) div 3)*3 ((j-1) div 3 1)] ];
end;
para j:=1 a 9 comienza
si no (j en s1) entonces
si no (j en s2) entonces noans;
si no (j en s3) entonces noans
fin
end;
fin;
comenzar
repetir
f:=0
para x:=1 a 9 hacer
p>p>
para y:=1 a 9 haz
si a[x, y]=0 entonces comienza
ky(a,x,y ,s);t :=0;
if s=[] entonces
noans
para i:=1 a 9 hazlo si i en s; luego comienza
t:=t 1; n:=i;
fin
si t=1 entonces comienza a[x, y]:= n; print(x, y, 14); f: = f 1; fin;
f: = f tct; hasta f=0;
fin
{=============Solución recursiva============= ===== =============================TRY}
respuesta de función: booleana p>
var
ans: booleano;
procedimiento try(num: byte);
var
i, j; , n, x, y: byte;
s:
comenzar
si se presiona la tecla, luego se lee la tecla de #27: detener #0: si readkey=#107 luego detener;
if numlt;=list.num luego comenzar
x:=list.dat[num].x;y:=list.dat [num].y ;
ky(a, x, y, s); si s=[] entonces sale
n:=random(8) ; p>
para j:=n a n 8 comience
i:=j mod 9 1
si i en s entonces comience
a[x, y ]:=i; imprimir(x, y, 10);
intenta(núm. 1);
a[x, y]:=0; (x, y, 0)
end
end
end else start
gotoxy(1,20); ); fondo de texto (0); delline; escribir ('¡Completo!'); respuesta: = tru
e; ans: = verdadero;
caso readkey de #27: detener; #0: si readkey=#107 entonces detener
textcolor(15); ); gotoxy(1, 20); delline; writeln('Intentando...');
fin
fin
comenzar
respuesta:=falso; ans:=falso;
intento(1)
fin
procedimiento crtinit; >var
OrigMode: Word;
begin
OrigMode:=LastMode; { Recordar modo de vídeo original }
TextMode(Lo( LastMode) Font8x8); { use 43 o 50 líneas en EGA/VGA }
end
procedimiento px; l: matriz [1..9] de registro
num: byte
dat: matriz [1..81] de punto
fin;
i, j, k: byte;
d: punto
comenzar
para i:=1 a 9 do l; [i].num:=0;
para i:=1 a 9 hazlo para j:=1 a 9 hazlo si a[i, j]=0 luego comienza
d.x:=i;d.y:=j;ky(a,i,j,d.s);d.n:=0;for k:=1 a 9 hacer si k en d.s entonces inc(d.n); >inc(l[d.n].num); l[d.n].dat[l[d.n].num]:=d
fin
lista.num:= 0;
for i:=1 a 9 hacer para j:=1 a l[i].num comenzar
inc(list.num); .num]:=l[i].dat[j];
fin;
fin
comenzar
aleatorizar;
crtinit;
textbackground(0); clrscr;
si ParamCount=0 entonces inputbkb(a) else inputbf(a, ParamStr(1));
textcolor(15); textbackground(0); gotoxy(1, 20); writeln('Pensando...');
textcolor(15); textbackground(0);gotoxy(1,20);delline;writeln('Comprobando...');px
textcolor(15);textbac
ground(0); gotoxy(1, 20); delline; writeln('Intentando...'); gotoxy(1, 1);
si no responde, entonces
textcolor(15); textbackground(0); gotoxy(1, 20); writeln('¡Eso es todo!');