不是VIP会员,不能显示答案

题目解答

题目:
[华容道](3+3+3+3+3+3=18分)
华容道取材于我国三国演义的一种小游戏,小王是一个编程爱好者,他就利用课余时间编写了一个华容道的游戏程序。当然小王的华容道和现实的华容道游戏有一些区别,小王的华容道游戏是这样设计的:
华容道由5*5的底版和24个大小一样的小正方形板组成。在每一个小正方形上印有一个不同的字母(A到X)。24个方块放入底版后,底版上还有一个空位。如果一个小方块紧挨着空位,则可以将其移动至空位。
按照这个游戏设计思想,小王开始编写程序,使得程序能根据输入的初始局面(各个小正方形板在华容道中的位置排列)和移动序列之后,输出华容道的最终局面。
问题是小王编写了程序后发现程序不能正确执行,根据他的经验,他觉得错误肯定发生在其中的6个地方(下面程序中标有数字的空格处),于是小王来向你这个编程高手请教,请你告诉小王这6个空格处正确的内容应该上什么。
程序一开始会让使用者输入华容道的初始局面和移动序列,前面5行5列组成华容道的初始局面,第6行表示移动序列。下面就是某个使用者的输入信息(第3行第2个位置是空位):
TRGSJ
XDOKI
M VLN
WPABE
UQHCF
ARRBBL
上面移动序列中包含了4种不同字母,分别表示了不同的移动方向,这些字母的含义是:A表示将空位上方的块移动到空位,B表示将空位下方的方块移动到空位;L表示将空位左方的方块移动到空位;R表示将空位右方的方块移动到空位。
一个正确的华容道程序应在得到上面的输入数据后,输出如下所示的最终局面(第4行第3个位置是空位);
TRGSJ
XOKLT
MDVBN
WP AE
UQHCF
考虑到有些用户可能会输入非法的移动信号,比如当空位在最下面一行时,移动信号为“B”,此时由于下面没有任何小方块了,所以是非法的移动,此时应让程序能输出“No answer”(此时不必输出华容道的最终局面)。
下列就是小王编写的程序,请帮助小王完善程序,并把答案书写在答案纸上。
 
Program test6;
  Var
   i1,j1,i2,j2,I,j,k:integer;
   s,x:char;
   a:array[1..5,1..5] of char;
   b:string;
   procedure err;
begin
  write(‘ No answer ’);halt;
end;
   procedure swp(var i1,j1,i2,j2:integer);
var
 t:char;
 t1:integer;
 begin
  t:=a[i1,j1];  a[i1,j1]:=a[i2,j2]; a[i2,j2]:=t;
  t1:=i1;i1:=i2;i2:=t1;t1:=j2;j2:=j1;j1:=t1;
  end;
begin
for i:=1 to 5 do
  begin
    for j:=1 to 5 do
      begin
        read(a[i,j]); if  a[i,j]=' '  then begin  i1:=i; j1:=j;end;
      end;
    readln;
  end;
  readln(b);
  k:=length(b);
  for i:=1 to k do
    begin
     if ((i1=1) and(b[i]=’A’)) or ((i1=5) and (b[i]=’B’)) or (j1=1) and (b[i]='L') or
  ((j1=5) and(b[i]=’R’))
      then err;
    i2:=i1;j2:=j1;
    case b[i] of 
      ‘A’:i2:=i1-1;
      ‘B’:i2:= i1+1 ;
      ‘L’: j2:=j1-1;
       ‘R’:j2:= j1+1 ;
    end;
      swp(i1,j1,i2,j2);
    end;
    for i:=1 to 5 do
      begin
         for j:=1 to 5 do
           write(a[i,j]);
           writeln;
      end;
     end.
考点:
分析:
解答:
评论:
老师: