2016-02-04 3 views
0

Я кодирую проблему с рыцарем, чтобы найти тур для рыцаря в шахматной доске n * n. Я сделал 2 ответа, которые, я думаю, идентичны. Однако при компиляции два кода дают 2 разных результата. Я хочу знать разницу между двумя моими кодами.Странный результат, отличный от предсказания (рыцарский тур)

Это мой первый код: http://ideone.com/WUI7xD.

`const max=10; 
type square=array [-1..max+1,-1..max+1] of longint; 
vector=array [1..max*max] of longint; 
var n:longint; 
x:array [1..8] of longint=(-2,-2,-1,-1,+1,+1,+2,+2); 
y:array [1..8] of longint=(-1,+1,-2,+2,-2,+2,-1,+1); 
c,r:square; 
a,b:vector; 
checking:boolean; 
procedure input; 
    begin 
    readln(n); 
    end; 
procedure backTrack(i,u,v:longint); 
var j:longint; 
    begin 
    if (i>n*n) then 
    begin 
    checking:=true; 
    exit; 
    end; 
    for j:=1 to 8 do 
    begin 
    if checking then exit; 
    inc(u,x[j]); 
    inc(v,y[j]); 
    if (u>0) and (u<=n) and (v>0) and (v<=n) and (i<=n*n) and (c[u,v]=0) then 
    begin 
    c[u,v]:=1; 
    r[u,v]:=i; 
    backTrack(i+1,u,v); 
    c[u,v]:=0; 
    end; 
    dec(u,x[j]); 
    dec(v,y[j]); 
    end; 
    end; 
procedure solve; 
    begin 
    fillchar(c,sizeof(c),0); 
    c[1,1]:=1; 
    r[1,1]:=1; 
    checking:=false; 
    backTrack(2,1,1); 
    end; 
procedure output; 
var j,i:longint; 
    begin 
    for j:=1 to n do 
    begin 
    for i:=1 to n do write(r[i,j],' '); 
    writeln; 
    end; 
    readln; 
    end; 
begin 
input; 
solve; 
output; 
end.` 

И мой второй код: http://ideone.com/FdFQuX

`const max=10; 
type square=array [-1..max+1,-1..max+1] of longint; 
vector=array [1..max*max] of longint; 
var n:longint; 
x:array [1..8] of longint=(-2,-2,-1,-1,+1,+1,+2,+2); 
y:array [1..8] of longint=(-1,+1,-2,+2,-2,+2,-1,+1); 
c,r:square; 
a,b:vector; 
checking:boolean; 
procedure input; 
    begin 
    readln(n); 
    end; 
procedure backTrack(i,u,v:longint); 
var j:longint; 
    begin 
    if (i>n*n) then 
    begin 
    checking:=true; 
    exit; 
    end; 
    r[u,v]:=i; 
    for j:=1 to 8 do 
    begin 
    if checking then exit; 
    inc(u,x[j]); 
    inc(v,y[j]); 
    if (u>0) and (u<=n) and (v>0) and (v<=n) and (i<=n*n) and (c[u,v]=0) then 
    begin 
    c[u,v]:=1; 
    backTrack(i+1,u,v); 
    c[u,v]:=0; 
    end; 
    dec(u,x[j]); 
    dec(v,y[j]); 
    end; 
    end; 
procedure solve; 
    begin 
    fillchar(c,sizeof(c),0); 
    c[1,1]:=1; 
    r[1,1]:=1; 
    checking:=false; 
    backTrack(1,1,1); 
    end; 
procedure output; 
var j,i:longint; 
    begin 
    for j:=1 to n do 
    begin 
    for i:=1 to n do write(r[i,j],' '); 
    writeln; 
    end; 
    end; 
begin 
input; 
solve; 
output; 
end.` 

Заранее большое спасибо.

ответ

0

r[u,v]:=i; появляется перед for j:=1 to 8 do во втором коде, но не в первом.

Есть differencing tools, который может использоваться, чтобы указать, где отличаются два текстовых файла. Это хорошая идея, чтобы ознакомиться с такими инструментами.

+0

Я думаю, что его позиция не оказывает никакого влияния на результат моего кода. Интересно, есть ли разница, если я помещу его в 2 разных положения, как мой вышеприведенный код. –

+0

Как это не могло измениться, поскольку его местоположение в первом коде находится в теле оператора 'if' (следовательно, предположительно не всегда выполняется), но его положение во втором коде безусловно? –

Смежные вопросы