Trên lới ô vuông kích thớc mìn (mÊ8, nÊ15) xếp mỗi ô một khối lập phơng (Hình 477.1). Mỗi mặt của khối lập phơng đợc đánh số theo một trong hai cách sau đây:
- Cách a: Mỗi mặt của khối lập phơng đợc ghi một trong ba số 1,2,3. Các mặt đối nhau có số nh nhau. Trên mỗi khối lập phơng đều xuất hiện đầy đủ cả ba số nói trên.
- Cách b: Mỗi mặt của khối lập phơng đợc ghi một trong sáu số 1,2,3,4,5,6 sao cho tổng hai số trên hai mặt đối diện đều bằng 7. Các số ở các mặt khác nhau là khác nhau.
Với mỗi cách đánh số nói trên, mỗi khối lập phơng đợc đặc trng bằng một bộ ba giá trị (a, b, c), trong đó a - số ở mặt trên, b - số ở mặt trớc, c - số ở mặt phải (Hình 477.2).
Các khối lập phơng có thể quay quanh trục X hoặc trục Y. đợc phép áp dụng các phép xoay sau: Xi+, Xi-, Yj+, Yj-.
Trong đó:
- Xi+ (hay Xi-) xoay toàn bộ các khối lập phơng ở hàng thứ i một góc 90o quanh trục X ngợc (hay cùng) chiều kim đồng hồ (Hình 477.2).
- Yj+ (hay Yj-) xoay toàn bộ các khối lập phơng ở cột thứ j một góc 90o quanh trục Y ngợc (hay cùng) chiều kim đồng hồ (Hình 477.2).
Cho file dữ liệu kiểu TEXT có tên là 'XOAY', trong đó dòng đầu ghi các giá trị m và n, mỗi dòng tiếp theo ghi giá trị bộ ba a,b,c tơng ứng của từng khối lập phơng từ trái qua phải lần lợt theo từng hàng.
Yêu cầu:
1) Nhập từ bàn phím một số và áp dụng các quy tắc đã nêu để đa tất cả các khối lập phơng về hình trạng có số ở mặt trên nh số đã nhập. Sau mỗi lần xoay hãy hiển thị đồng thời trên cùng một trang màn hình trong khoảng thời gian không ít hơn 0.5 giây:
- Các bộ giá trị a,b,c của từng khối lập phơng trớc khi xoay. - Lới mìn các số ở mặt trên của khối trớc khi xoay.
- Phép xoay đợc sử dụng.
- Lới mìn các số ở mặt trên của khối sau khi xoay.
2) Sử dụng các phép xoay nói trên để biến đổi hình trạng đợc thể hiện ở file 'XOAY' về hình trạng có các số ở mặt trên của m x n khối lập phơng đợc đa từ bàn phím từ trái qua phải và lần lợt theo từng hàng.
Giải quyết các yêu cầu (1) và (2) với từng cách đánh số (a) và (b) nêu trên. Yêu cầu: Chơng trình phải có khả năng thực hiện các yêu cầu một cách độc lập.
478. S - dãy
(Đề thi Olimpic quốc tế 1991)
Ta gọi một "S-dãy" là xâu bao gồm ký tự S và các dấu đóng mở ngoặc đợc định nghĩa đệ qui nh sau: - S là S-dãy.
- Nếu M,N là S-dãy thì (MN) cũng là S-dãy.
Sau đây là ví dụ của một S-dãy: ((((SS)(SS))S)(SS)).
Các dấu ngoặc phải không mang thêm thông tin mới nào do vậy có thể bỏ chúng đi đợc, nghĩa là có thể viết (MN thay cho (MN). Trong thí dụ trên có thể viết:
1) Viết thủ tục "Gensterm" sinh các S-dãy: Thủ tục cần phải tạo ra n file Text, các file này sẽ chứa tất cả các S-dãy độ dài lần lợt là 1,2,..n (độ dài ở đây hiểu là số các ký tự S). Mỗi S-dãy nằm trên một dòng. Viết chơng trình nhập từ bàn phím số tự nhiên n (n<=10). Sử dụng thủ tục trên để sinh ra và hiện lên màn hình tất cả các S-dãy tơng ứng.
Xét phép biến đổi sau trên các S-dãy. Các phép biến đổi này đợc gọi là S-bd:
Một dãy con của S-dãy có dạng (((SA)B)C) có thể viết lại dới dạng ((AC)(BC)) (ở đây A,B,C là các S-dãy).
Ví dụ:
Context1(((SA)B)C)Context2 đ Context1((AC)(BC)) Context2.
Việc áp dụng các phép biến đổi trên đối với S-dãy cũng đợc gọi là các phép "Rút gọn".
Có rất nhiều cách áp dụng các phép S-bd trên các S-dãy. Quá trình biến đổi một S-dãy cho đến khi không thể biến đổi đợc nữa gọi là quá trình chuẩn hoá của S-dãy.
Sau đây là ví dụ của một chuỗi rút gọn nh vậy: ((((SS)(SS))S)(SS)) đ (((SS)((SS)S))(SS)) đ ((S(SS))(((SS)S)(SS))) đ ((S(SS))((S(SS))(S(SS))))
2) Hãy tìm một cấu trúc dữ liệu hợp lý để biểu diễn các S-dãy và các phép biến đổi S-bd trên các dãy này.
Viết hai thủ tục:
"Readterm" dùng để biến đổi S-dãy từ dạng sinh ra bởi Gensterm về dạng dữ liệu hợp lý của bạn. "Printterm" dùng để biến đổi S-dãy từ dạng hợp lý của bạn về dạng đợc sinh bởi Gensterm. Chơng trình phải biểu diễn đợc các biến đổi trên.
3) Viết thủ tục "Reduce" dùng để biểu diễn một bớc rút gọn tuân theo qui luật S-bd.
4) Viết thủ tục "Normalize": cho trớc một S-dãy, cần áp dụng một chuỗi các S-d trên S-dãy này cho đến khi không thể biến đổi đợc nữa hoặc cho đến khi số các phép biến đổi vợt quá một giới hạn nào đó, ví dụ 30. Chơng trình cần thể hiện rõ quá trình rút gọn này.
5) Kết hợp tất cả các yêu cầu trên để viết một chơng trình: a. đọc vào số n từ bàn phím.
b. Sử dụng Gensterm sinh ra các S-dãy có độ dài n. c. Biến đổi các S-dãy này về dạng hợp lý của bạn. d. Chuẩn hóa dãy này nếu có thể đợc.
e. Kết quả đa ra bảng các S-dãy đã đợc chuẩn hoá.
f. Ghi lại số các phép rút gọn đơn vị các S-dãy đã đợc chuẩn hoá hoặc đa ra thông báo "Không chuẩn hóa đợc" đối với các S-dãy không chuẩn hoá đợc hoặc số phép biến đổi vợt quá 30.
g. Ghi lại tổng số các S-dãy không chuẩn hóa đợc và tổng số các S-dãy có thể chuẩn hóa đợc.