Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Программа для решения простых Судоку (бесконечный цикл) (http://forum.oszone.net/showthread.php?t=127774)

m.s.dos 05-01-2009 02:42 997561

Программа для решения простых Судоку (бесконечный цикл)
 
Всем привет. Пытался написать на pascal программу, решающую элементарное судоку. Но возникает бесконечный цикл. Не могу понять почему.


Код:

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 998957

Код:

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 999010

спасибо, попробую поменять переменные. Отпишусь

m.s.dos 07-01-2009 05:05 999415

да, проблема, видимо в этом, и еще в том, что программа не может вовремя остановить цикл...


Время: 13:35.

Время: 13:35.
© OSzone.net 2001-