切换到宽版
  • 14927阅读
  • 17回复

程序设计类-跳马问题求解 [复制链接]

上一主题 下一主题
离线johnson
只看该作者 10 发表于: 2007-01-26
var
h : array[-1..7,-1..7] of integer;
a,b : array[1..8] of integer;
i,j,num : longint;

procedure print;
var
  i,j : integer;
begin
  num := num + 1;
  if num <= 5
    then begin
        for i := 1 to 5 do
          begin
          for j := 1 to 5 do
            write(h[i,j]:4);
          writeln;
          end;
        writeln;
        end;
end;

procedure try(x,y,i : integer);
var
  j,u,v : integer;
begin
  for j := 1 to 8 do
    begin
    u := x + a[j];
    v := y + b[j];
    if h[u,v] = 0
      then begin
          h[u,v] := i;
          if i < 25
            then
              try(u,v,i+1)
            else
              print;
          h[u,v] := 0;
          end;
    end;
end;

begin
for i := -1 to 7 do
  for j := -1 to 7 do
    if (i>=1) and (i<=5) and (j>=1) and (j<=5)
    then h[i,j] := 0
    else h[i,j] := 1;
a[1] := 2; b[1] := 1;
a[2] := 1; b[2] := 2;
a[3] := -1; b[3] := 2;
a[4] := -2; b[4] := 1;
a[5] := -2; b[5] := -1;
a[6] := -1; b[6] := -2;
a[7] := 1; b[7] := -2;
a[8] := 2; b[8] := -1;
num := 0;
h[1,1] := 1;
try(1,1,2);
writeln('num= ',num);
readln;
end.
离线johnson
只看该作者 11 发表于: 2007-01-26
var
a     : array[1..5,1..5] of integer;
b     : array[1..5,1..5] of boolean;
u,v   : array[1..8] of integer;
i,j,num : integer;

procedure print;
var
k,kk:integer;
begin
num:=num+1;
if num<=5 then begin
  for k:=1 to 5 do begin
    for kk:=1 to 5 do
    write(a[k,kk]:5);
    writeln;
    end;
    writeln;
  end;
end;

procedure try(i,j,n:integer);
var
k,x,y:integer;
begin
if n>25 then begin
  print;
  exit;
end ;
for k:=1 to 8 do begin
  x:=i+u[k];
  y:=j+v[k];
  if (x<=5) and (x>=1) and (y<=5) and (y>=1) and b[x,y] then begin
    b[x,y]:=false;
    a[x,y]:=n;
    try(x,y,n+1);
    b[x,y]:=true;
    a[x,y]:=0;
  end;
end;
end;

begin
u[1]:=1; v[1]:=-2;
u[2]:=2; v[2]:=-1;
u[3]:=2; v[3]:=1;
u[4]:=1; v[4]:=2;
u[5]:=-1; v[5]:=2;
u[6]:=-2; v[6]:=1;
u[7]:=-2; v[7]:=-1;
u[8]:=-1; v[8]:=-2;
{for i:=1 to 5 do
  for j:=1 to 5 do begin
    a[i,j]:=0;
    b[i,j]:=true;
  end;}
fillchar(a,sizeof(a),0);
fillchar(b,sizeof(b),true);
a[1,1]:=1;
b[1,1]:=false;
try(1,1,2);
writeln(num);
readln;
end.
离线clwxzh57
只看该作者 12 发表于: 2007-08-15
easy!
离线lwx
只看该作者 13 发表于: 2007-08-24
着道题本来不用这么麻烦的,我也做过的,我们竞赛班经常做的!
离线syc_pascal
只看该作者 14 发表于: 2007-10-19
牛人!!!
I KNOW I CAN!
你行,我也行!
你傻,我不傻!
全面落实社会主义骗分观,学习三个代表的成功骗分精神!
离线serenity
只看该作者 15 发表于: 2007-10-19
这么复杂啊
我还没有学到这个地步
离线syc_pascal
只看该作者 16 发表于: 2007-12-07
饿补吧..
I KNOW I CAN!
你行,我也行!
你傻,我不傻!
全面落实社会主义骗分观,学习三个代表的成功骗分精神!
离线ddddddd
只看该作者 17 发表于: 2007-12-08
dfs+方向数组
快速回复
限100 字节
 
上一个 下一个