Bài 26: Các ký tự Đề thi HSG Tỉnh Tên chương trình: LETTERS.PAS Trò chơi được mô tả như sau: trên một bảng hình chữ nhật chia R hàng và C cột có các ký tự chữ hoa A-Z được viết trên mỗi
Trang 1Bài 26: Các ký tự (Đề thi HSG Tỉnh) Tên chương trình: LETTERS.PAS
Trò chơi được mô tả như sau: trên một bảng hình chữ nhật chia R hàng và C cột có các ký tự chữ hoa (A-Z) được viết trên mỗi ô của bảng Trước khi bắt đầu trò chơi có một hình ở góc trên bên trái của bảng (hàng 1, cột 1) Trong mỗi bước di chuyển, một người chơi có thể di chuyển hình đến vị trí các ô liền kề ( lên trên, xuống dưới, sang trái, sang phải) với ràng buộc rằng hình không thể di chuyển đến vị trí kế tiếp nếu ô này chứa ký tự
đã xuất hiện mà hình đã di chuyển qua Mục đích của trò chơi là chơi để có nhiều bước di chuyển nhất có thể được
Viết chương trình xác định số vị trí tối đa trong bảng mà hình có thể viếng thăm trong trò chơi
Dữ liệu: Vào từ tập tin văn bản LETTERS.INP
- Dòng thứ nhất chứa hai số nguyên R và C, được viết cách nhau bởi một dấu
cách,
(1 ≤ R, C ≤ 20 )
- R dòng tiếp theo chứa, mỗi dòng chứa 1 xâu ký tự Mỗi dòng biểu diễn một hàng
của bảng
Kết quả : Ghi vào tập tin văn bản LETTERS.OUT một số nguyên là giá trị lớn nhất các vị trí mà hình có thể di chuyển trên bảng
Ví dụ:
2 4
CAAB
ADCB
3 6 HFDFFB AJHGDH DGAGEH
Chương trình cụ thể như sau:
var f1,f2:text;
m,n:integer;
a:array[1 10,1 10] of char;
b:array[1 10,1 10] of string[10];
c:array[1 100] of integer;
procedure doctep;
var i,j:integer;
begin
assign(f1,'c:\letters.inp');reset(f1);
assign(f2,'c:\letters.out');rewrite(f2);
readln(f1,m,n);
for i:=1 to m do
begin
for j:=1 to n do read(f1,a[i,j]);
readln(f1);
end;
end;
Procedure taomang;
var i,j:integer;
begin
Trang 2Fillchar(B,sizeof(B),’’);
b[1,1]:=a[1,1];
for i:=2 to m do
if (b[i-1,1]<>'') and (pos(a[i,1],b[i-1,1])=0) then b[i,1]:=b[i-1,1]+a[i,1];
for i:=2 to n do
if (b[1,i-1]<>'') and (pos(a[1,i],b[1,i-1])=0) then b[1,i]:=b[1,i-1]+a[1,i];
for i:=2 to m do
for j:=2 to n do
begin
if(b[i,j-1]<>'') and (pos(a[i,j],b[i,j-1])=0) then
b[i,j]:=b[i,j-1]+a[i,j]
else
if (b[i-1,j]<>'') and (pos(a[i,j],b[i-1,j])=0) then
b[i,j]:=b[i-1,j]+a[i,j];
end;
WRITELN('MANG B LA');
FOR I:=1 TO M DO
BEGIN
FOR J:=1 TO N DO WRITE(B[I,J],' ');
WRITELN;
END;
end;
procedure xuli;
var i,j,d,max:integer;
begin
d:=0;
for i:=1 to m do
for j:=1 to n do
begin
d:=d+1;
c[d]:=length(b[i,j]);
end;
max:=1;
for i:=2 to m*n do
if c[i]>max then max:=c[i];
writeln(f2,max);
close(f1);close(f2);
end;
BEGIN
doctep;
taomang;
xuli;
READLN
END
Trang 3Cách 2: Giải bằng đệ quy quay lui
Program LETTERS;
Const hx:array[1 4] of integer = (-1,0,1,0);
hy:array[1 4] of integer = (0,-1,0,1);
Nmax=20;
fi='LETTERS.INP';
fo='LETTERS.OUT';
Var A:array[1 Nmax,1 Nmax] of char;
kt:array[1 Nmax,1 Nmax] of boolean;
M,N,x,y,u,v,i,j:integer;
S,ketqua:string;
f:text;
Procedure doctep;
Begin
Assign(f,fi);reset(f);
Readln(f,M,N);
for i:=1 to m do
begin
for j:=1 to n do read(f,A[i,j]);
readln(f);
end;
close(f);
End;
Procedure khoitao;
Begin
fillchar(kt,sizeof(kt),true);
x:=1;y:=1;kt[x,y]:=false;
s:=a[1,1];ketqua:='';
End;
Procedure try(m:integer);
var r:byte;
Begin
if length(s)>length(ketqua) then ketqua:=s;
For r:=1 to 4 do
begin
u:=x+hx[r];
v:=y+hy[r];
if (u>=1) and (u<=m) and (v>=1) and (v<=n) then
if (Pos(A[u,v],S)=0) and (kt[u,v]) then
begin
x:=u;
y:=v;
kt[u,v]:=false;
S:=S+A[u,v];
try(m+1);
kt[u,v]:=true;
x:=x-hx[r];
Trang 4y:=y-hy[r];
delete(s,length(s),1); end;
end;
End;
BEGIN
doctep;
khoitao;
try(1);
Assign(f,fo);rewrite(f); write(f,ketqua);
close(f);
END