Page 86 - C:\Users\Admin\Desktop\Sach mem upweb\
P. 86

100 Problems & Solutions                                                Trang 86


                      Nhận xét: Lời giải dùng thuật toán quy hoạch động của Phạm Đức Thanh tốt hơn rất
                      nhiều so với thuật toán đệ quy quay lui.

                      Bài 39/2000 - Ô chữ
                      {$A+,B-,D+,E+,F-,G-,I+,L+,N-,O-,P-,Q+,R+,S-,T-,V+,X+}
                      {$M 16384,0,655360}
                      uses crt;

                      const    fi     =       'input.txt';
                               fo     =       'output.txt';

                      var      A      :       array[1..5,1..5] of char;
                               new,blank   :  record x,y : integer end;

                      procedure no_no_and_no;
                      var       f            :        text;
                      begin
                           assign(f,fo);
                           rewrite(f);
                           write(f,'This puzzle has no final configuration.');
                           close(f);
                           halt;
                      end;

                      procedure yes_yes_and_yes;
                      var       f               :     text;
                                i,j             :     byte;
                      begin
                           assign(f,fo);
                           rewrite(f);
                           for i := 1 to 5 do
                               begin
                                    for j :=1 to 5 do
                                        write(f,a[i,j]);
                                    writeln(f);
                               end;
                           close(f);
                      end;

                      procedure swap(px,py  : integer);
                      var       coc    :   char;
                      begin
                           new.x := blank.x + px;
                           new.y := blank.y + py;
                           if (new.x >5) or (new.y >5) or (new.x <1) or (new.y <1) then
                              no_no_and_no;

                           coc := A[new.x,new.y];
                           A[new.x,new.y] := A[blank.x,blank.y];
                           A[blank.x,blank.y] :=coc;
                           blank := new;
                      end;

                      procedure chuyen(ch : char);
                      begin
                           case ch of
                           'A' : swap( -1,0);
                           'B' : swap(  1,0);
                           'R' : swap( 0, 1);



                      Tin học & Nhà trường                                       100 Đề Toán - Tin học
   81   82   83   84   85   86   87   88   89   90   91