PDA

Показать полную графическую версию : Программа для решения простых Судоку (бесконечный цикл)


m.s.dos
05-01-2009, 02:42
Всем привет. Пытался написать на pascal программу, решающую элементарное судоку (http://ru.wikipedia.org/wiki/Судоку). Но возникает бесконечный цикл. Не могу понять почему.


program sudoku4;
type shortstr=string[9];
var a,b,c,c_temp,c_temp2,co,d,e,i,j,ip,x,oldc:integer;
mas:array[1..9,1..9] of byte;
ef:array[1..162,0..9] of byte;
str:array[1..9] of shortstr;
rand:array[1..81] of byte;
label 1;

begin
randomize;


for i:=1 to 9 do readln(str[i]);


{preobrazovanie massiva}
for i:=1 to 9 do begin
for j:=1 to 9 do begin
val(str[i,j],mas[i,j],c);
end;
end;


ip:=1;
{sohranenie koordinat pustyh ya4eek}
for i:=1 to 9 do begin
for j:=1 to 9 do begin
if mas[i,j]=0 then begin ef[ip,0]:=i; ip:=ip+1; ef[ip,0]:=j; ip:=ip+1; end;
end;
end;

co:=(ip-1) div 2;

1:

for i:=co downto 0 do begin


{sozdanie massiva slu4aynyh 4isel}
c:= (ip-1) div 2;
for i:=1 to c do begin
rand[i]:=random(9)+1;
end;
d:=1;

writeln(' ');
for i:=1 to c do write(rand[i],' ');
writeln(' ');

for a:=1 to c do
begin
mas[ef[d,0],ef[d+1,0]]:=rand[a];
d:=d+2;
write(mas[ef[d,0],ef[d+1,0]]);
write('a=',a);
end;

c_temp:=c-1;




{zanosim polosy i,j dlya pustyh ya4eek v ef}


for i:=1 to ip-1 do
{esli stroka}
if i mod 2<>0 then
begin
for j:=1 to 9 do
ef[i,j]:=mas[ef[i,0],j];
end
{esli stolbec}
else
begin
for j:=1 to 9 do
ef[i,j]:=mas[j,ef[i,0]];
end;

{vyvod massiva ef na ekran}
writeln('ef');
for i:=1 to ip-1 do begin
for j:=0 to 9 do begin
write(ef[i,j]);
end;
writeln;
end;

c:=(ip-1) div 2;
writeln('c=',c);
co:=c;
writeln('xxx=',mas[ef[1,0],ef[2,0]]);


{proverka na sovpadeniya v stroke/stolbce}
for x:=1 to ip-1 do
begin

for i:=1 to 9 do
begin
a:=ef[x,i];
for j:=1 to 9 do
if (ef[x,j]=a)and(j<>i) then goto 1;
end;

end;

end;





{vyvod massiva mas na ekran}
writeln('');
for i:=1 to j do begin
for j:=1 to 9 do begin
write(mas[i,j]);
end;
writeln;
end;




readln;

end.

Alan85
06-01-2009, 19:20
for x:=1 to ip-1 do
begin
for i:=1 to 9 do
begin
a:=ef[x,i];
for j:=1 to 9 do
if (ef[x,j]=a)and(j<>i) then goto 1;
end;




Имхо опасный код. И вообще лучше избегать метки. Я точно не уловил всю логику программы(фомат входных данных не известен), но вот еще нашел следущее:
Обрати внимания что вложенный цикл использует для итерации туже переменную что и основной - i .


for i:=co downto 0 do begin
{sozdanie massiva slu4aynyh 4isel}
c:= (ip-1) div 2;
for i:=1 to c do begin
rand[i]:=random(9)+1;
end;


Глянул дальше.. другие циклы тоже используют эту переменную практически до конца программы

m.s.dos
06-01-2009, 20:28
спасибо, попробую поменять переменные. Отпишусь

m.s.dos
07-01-2009, 05:05
да, проблема, видимо в этом, и еще в том, что программа не может вовремя остановить цикл...




© OSzone.net 2001-2012