Bài 23/2000 - Quay Rubic
(Dành cho học sinh THPT)
Khai triển mặt rubic và đánh số các mặt như hình vẽ sau:
Khi đó ta có thể xây dựng thủ tục Quay (mặt thứ i) để đổi màu 8 mặt con của mặt này và 12 mặt con kề với
mặt này. Trên cơ sở đó giải được 2 bài toán này. Chương trình có thể viết như sau:
Program Rubic;
uses Crt;
Type Arr= array[0..5, 0..7] of byte;
const color: Array [0..5] of char=('F', 'U','R', 'B', 'L', 'D');
Var
A1, A2, A0, A: Arr;
X, X1, X2: String;
k: byte;
Procedure Nhap;
Var i, j: byte;
Begin
Clrscr;
Writeln ('Bai toan 1. So sanh hai xau:');
Writeln ('Nhap xau X1:');
Readln (X1);
Writeln (' Nhap xau X2:');
Readln (X2);
Writeln ('Bai toan 2. Tinh so lan xoay:');
Write ('Nhap xau X:');
Readln (X);
For i:= 0 to 5 do
For j:= 0 to 7 do A[i, j]:= i;
A:=A0; A1:=A0; A2:=A0;
End;
Procedure Quay (Var A: Arr; k: byte);
Const Dir : array
[0.. 5, 0.. 3, 0.. 3] of byte = ( ( (1,2,5,4), (6,0,2,4), (5,7,1,3), (4,6,0,2) ),
( (0,4,3,2), (0,0,4,0), (1,1,5,1), (2,2,6,2) ),
( (0,1,3,5), (4,4,4,4), (3,3,3,3), (2,2,2,2) ),
( (1,4,5,2), (2,0,6,4), (1,7,5,3), (0,6,4,2) ),
( (0,5,3,1), (0,0,0,0), (7,7,7,7),(6,6,6,6) ),
( (0,2,3,4), (6,6,2,6), (5,5,1,5), (4,4,0,4) ) );
var i,j,tg: byte;
tg:=A[k,6];
for i:=3 downto 1 do A[k,0] := A[k,2*i-2];
A[k,0]:=tg;
tg:=A[k,7];
for i:=3 downto 1 do A[k,2*i] := A[k,2*i -2];
A[k,1]:=tg;
for i:=1 to 3 do
begin
tg:=A[dir[k,0,3], Dir[k,i,3];
for j:=3 downto 1 do A[ dir[k,0,j], Dir[k,i,j] ]:= A[ dir[k,0,j-1], Dir[k,i,j-1] ];
A[ [dir[k,0,0], Dir[k,i,0] ]:=tg;
end;
Function Eq(A,B:Arr):Boolean;
Var i,j,c:byte;
c:=0;
for i:=1 to 5 do
for j:=1 to 7 do
xx dd vv xx
If A[i,j] <> B[i,j] then inc(c);
vv dd xx vv
If c=0 then Eq:=true else Eq:=false;
dd xx vv dd
Procedure QuayXau(x:string; var A: arr);
xx vv dd xx
Var i,j:byte;
dd vv xx dd
for i:=1 to length(X) do
vv xx dd vv
for j:= 1 to 5 do
If Color[j] = X[i] then Quay(A,j);
Procedure Bai1;
QuayXau(X1,A1);
QuayXau(X2,A2);
Procedure Bai2;
k:=0;
Repeat
QuayXau(X,A);
Inc(k);
Until Eq(A,A0);
Procedure Xuat;
writeln;
writeln('Ket qua:');
writeln('Bai toan 1. So sanh 2 xau:') ;
If Eq(A1,A2) then writeln('Hai xau X1 va X2 cho cung mot ket qua.');
writeln('Can ap dung xau X ',k,' lan de Rubic quay ve trang thai ban dau.');
Readln;
Nhap;
Bai1;
Bai2;
Xuat;
END.
Bạn đang xem bài 23/ - 100 DE TIN HSG CO DAP AN