0

私は騎士の巡回問題をコーディングして、* n チェス盤で騎士の巡回を見つけています。私は2つの答えを出しましたが、どちらも同じだと思います。ただし、コンパイルすると、2 つのコードが 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.

そして私の2番目のコード: 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.
4

1 に答える 1

0

r[u,v]:=i;2 番目のコードでは前for j:=1 to 8 doに表示されますが、最初のコードでは表示されません。

2 つのテキスト ファイルのどこが異なるかを判断するために使用できる差分ツールがあります。このようなツールに慣れておくことをお勧めします。

于 2016-02-04T14:25:48.643 に答える