Đề thi Trò chơi Tích - Tắc vuông
Bạn đang xem nội dung tài liệu Đề thi Trò chơi Tích - Tắc vuông, để tải tài liệu về máy bạn click vào nút DOWNLOAD ở trên
Bài 75/2001 - Trò chơi Tích - Tắc vuông
(Dành cho học sinh THCS và PTTH)
(* Thuat toan:
Chia ban co lam 4 huong: Dong , Tay , Nam , Bac. Ta co cach di sau:
i) Luon di theo o lien canh voi o truoc
ii) Di theo huong khong bi chan. Vi du: o buoc 1 neu bi chan o huong Dong
thi di theo huong nguoc lai la huong Tay. Di theo huong Tay den khi huong Tay bi chan thi di theo huong Bac hoac Nam.
Trong khi di ta luon de y 2 dieu kien sau:
1. Neu co 3 o da lap thanh 3 dinh cua 1 hinh vuong ma o thu 4 chua bi di
thi ta se di o thu 4 va gianh duoc thang loi.
2. Neu co 2k+1(k>=1) o lien canh lien tiep thi kiem tra co the gianh thang
loi bang nuoc do^i khong? Nuoc do^i la nuoc ta danh vao 1 o nhung co the co duoc 2 hinh vuong. vi du: co 3 o (1,1);(1,2);(1,3) thi ta co the danh nuoc doi bang cach danh vao o (2,2) nhu vay ta co kha nang hinh thanh 2 o vuong. Nhung sau 1 nuoc di doi thi chi duy nhat chan duoc 1 o vuong, ta co the danh nuoc tiep theo de hinh thanh o vuong con lai va gianh duoc thang loi.
Bang cach danh nhu vay ban co the chien thang trong vong toi da la 10 nuoc.*)
{$A+,B-,D+,E+,F-,G-,I+,L+,N-,O-,P-,Q-,R+,S+,T-,V+,X+}
{$M 16384,0,655360}
CONST Min=-50;
Max=50;
TYPE Ma=Array[Min..Max,Min..Max] of char;
diem= Record
hg,cot:Integer;
End;
Qu=Array[1..Max] of diem;
VAR dmay,dng,dc1,dc2:diem;
hgdi:Integer; (*1:B ; 2:D ; -1:N ; -2:T*)
fin,ok:Boolean;
A:Ma;
Q,Qc:Qu;
dlt,dq,cq:Integer;
Procedure HienA(hgd,hgc,cotd,cotc:Integer);
Var i,j:Integer;
Begin
For i:=hgd to hgc do
Begin
For j:=cotd to cotc do Write(A[i,j],' ');
Writeln;
End;
End;
Procedure finish(d:diem);
Begin
A[d.hg,d.cot]:='x';
HienA(-10,10,-10,10);
Writeln('Ban da thua! An ENTER de ket thuc chuong trinh');
Readln;
Halt;
End;
Procedure Init;
Begin
Fillchar(A,sizeof(A),'.');
fin:=false;
Writeln('Gia thiet bang o vuong co: 101 hang (-50 -> 50)');
Writeln(' 101 cot (-50 -> 50)');
Writeln('Gia thiet may luon di nuoc dau tien tai o co toa do (0:0)');
dmay.hg:=0; dmay.cot:=0; A[dmay.hg,dmay.cot]:='X';
HienA(-10,10,-10,10);
dlt:=1;
End;
Procedure Sinh(d1:diem; Var d2:diem; hgdi,k:integer);
Var h,c:Integer;
Begin
h:=d1.hg; c:=d1.cot;
Case hgdi of
1: Dec(h,k);
2: Inc(c,k);
-1: Inc(h,k);
-2: Dec(c,k);
End;
d2.hg:=h; d2.cot:=c;
End;
Function kt(Var d1,d2:diem):boolean;
Var g1,g,g2:diem;
k,p:integer;
Begin
kt:=true;
k:=(dlt-1) div 2;
p:=2 div abs(hgdi);
sinh(dmay,g1,-hgdi,k);
sinh(dmay,g2,-hgdi,2*k);
sinh(g1,g,p,k);
sinh(dmay,d1,p,k);
sinh(g2,d2,p,k);
If (A[d1.hg,d1.cot]='.')and(A[g.hg,g.cot]='.')and(A[d2.hg,d2.cot]='.')then
begin A[g.hg,g.cot]:='x'; HienA(-10,10,-10,10); exit; end;
sinh(g1,g,-p,k);
sinh(dmay,d1,-p,k);
sinh(g2,d2,-p,k);
If (A[d1.hg,d1.cot]='.')and(A[g.hg,g.cot]='.')and(A[d2.hg,d2.cot]='.')then
begin A[g.hg,g.cot]:='x'; HienA(-10,10,-10,10); exit; end;
kt:=false;
End;
Procedure Ngdi;
Begin
Repeat
Write('Nhap toa do diem (hang,cot): '); Readln(dng.hg,dng.cot);
Until (dng.hg>=Min)and(dng.hg=Min)and(dng.cot<=Max)and(A[dng.hg,dng.cot]='.');
A[dng.hg,dng.cot]:='1'; HienA(-10,10,-10,10);
End;
Function Hgchan:Integer;
Var Hgc:Integer;
Begin
If dmay.cot<dng.cot then
Begin
Hgc:=2;
If Hgc=hgdi then Begin Hgchan:=Hgc; Exit; End;
End;
If dmay.cot>dng.cot then
Begin
Hgc:=-2;
If Hgc=hgdi then Begin Hgchan:=Hgc; Exit; End;
End;
If dmay.hg<dng.hg then
Begin
Hgc:=-1;
If Hgc=hgdi then Begin Hgchan:=Hgc; Exit; End;
End;
If dmay.hg>dng.hg then
Begin
Hgc:=1;
If Hgc=hgdi then Begin Hgchan:=Hgc; Exit; End;
End;
Hgchan:=Hgc;
End;
Procedure Nap(Var Q:Qu; d1:diem; hgdi,k:Integer);
Var h,c:Integer;
d2:diem;
Begin
Sinh(d1,Q[cq],hgdi,k);
End;
Procedure Maydi;
Begin
Inc(dq);
if not ok then
Begin
If Q[dq].hg<dmay.hg then hgdi:=1
Else If Q[dq].hg>dmay.hg then hgdi:=-1
Else If Q[dq].cot<dmay.cot then hgdi:=-2
Else If Q[dq].cot>dmay.cot then hgdi:=2;
End;
dmay:=Q[dq];
A[q[dq].hg,q[dq].cot]:='x';
HienA(-10,10,-10,10)
End;
Procedure Process;
Var Hgc,p,i,ntt:Integer;
Begin
ok:=true; ntt:=0;
Ngdi;
Hgc:=Hgchan; Hgdi:=-Hgc;
Inc(cq); Nap(Q,dmay,hgdi,1); Maydi; Inc(dlt);
Repeat
Ngdi; Hgc:=Hgchan;
If ntt=1 then
If A[dc1.hg,dc1.cot]='.' then finish(dc1)
Else finish(dc2);
If ntt=0 then If (dlt>=3) and (kt(dc1,dc2)) then ntt:=1;
If (Hgc=Hgdi) then
If ok then
Begin
p:=2 div abs(Hgc);
For i:=1 to dlt-1 do
Begin
Inc(cq); Nap(Q,dmay,p,i); Nap(Qc,Q[cq],-hgdi,i);
Inc(cq); Nap(Q,dmay,-p,i);Nap(Qc,Q[cq],-hgdi,i);
End;
ok:=false;
dlt:=1;
End
Else
Begin
hgdi:=-hgdi; Inc(cq); Nap(Q,dmay,hgdi,dlt);
End;
If ntt=0 then
Begin
If dq=cq then Begin Inc(cq); Nap(Q,dmay,hgdi,1); End;
If A[Qc[dq].hg,Qc[dq].cot]='.' then finish(Qc[dq]);
Maydi; Inc(dlt);
End;
Until fin;
End;
BEGIN
Init;
Process;
END.
File đính kèm:
De thi Toan Tin hoc trong nha truong Bai 75.doc



