Bài 26: Các ký tự (Đề thi HSG Tỉnh) Tên chương trình: LETTERS.PAS Trò chơi mô tả sau: bảng hình chữ nhật chia R hàng C cột có ký tự chữ hoa (A-Z) viết ô bảng Trước bắt đầu trò chơi có hình góc bên trái bảng (hàng 1, cột 1) Trong bước di chuyển, người chơi di chuyển hình đến vị trí ô liền kề ( lên trên, xuống dưới, sang trái, sang phải) với ràng buộc hình di chuyển đến vị trí ô chứa ký tự xuất mà hình di chuyển qua Mục đích trò chơi chơi để có nhiều bước di chuyển Viết chương trình xác định số vị trí tối đa bảng mà hình viếng thăm trò chơi Dữ liệu: Vào từ tập tin văn LETTERS.INP - Dòng thứ chứa hai số nguyên R C, viết cách dấu cách, (1 ≤ R, C ≤ 20 ) - R dòng chứa, dòng chứa xâu ký tự Mỗi dòng biểu diễn hàng bảng Kết : Ghi vào tập tin văn LETTERS.OUT số nguyên giá trị lớn vị trí mà hình di chuyển bảng Ví dụ: letters.inp letters.inp 24 36 CAAB HFDFFB ADCB AJHGDH DGAGEH letters.out Chương trình cụ thể 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 begin for j:=1 to n read(f1,a[i,j]); readln(f1); end; end; Procedure taomang; var i,j:integer; begin letters.out Fillchar(B,sizeof(B),’’); b[1,1]:=a[1,1]; for i:=2 to m 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 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 for j:=2 to n 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 for j:=1 to n begin d:=d+1; c[d]:=length(b[i,j]); end; max:=1; for i:=2 to m*n if c[i]>max then max:=c[i]; writeln(f2,max); close(f1);close(f2); end; BEGIN doctep; taomang; xuli; READLN END Cách 2: Giải đệ 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 begin for j:=1 to n 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 begin u:=x+hx[r]; v:=y+hy[r]; if (u>=1) and (u=1) and (v