Tải bản đầy đủ (.doc) (187 trang)

ĐỀ THI OLYMPIC TIN HỌC QUỐC TẾ potx

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (3.1 MB, 187 trang )


Đây là cuộc thi Olympiad Quốc tế môn
Tin học đầu tiên được tổ chức tại thành
phố Pravetz, Bulgaria từ ngày 16 đến
ngày 19 tháng 5 năm 1989

Bài toán 1
Cho trước 2*N hộp nằm cạnh nhau trên cùng một hàng với N <= 5. Trong đó có hai hộp
liền nhau trống rỗng, các hộp còn lại chứa N-1 vật "A" và N-1 vật "B".
Ví dụ, với N = 5 ta có như sau:

Quy tắc trao đổi: Chuyển các vật trong hai hộp liền nhau chứa đồ vật sang hai hộp rỗng,
giữ nguyên vị trí các hộp.
Yêu cầu
Tìm cách hoán chuyển sao cho tất cả các hộp chứa vật A nằm bên trái các hộp chứa vật
B, không cần biết các hộp rỗng nằm ở đâu.
Bài toán đặt ra
Hãy viết chương trình:
1. Xây dựng mô hình hoán chuyển các hộp với số hộp và trạng thái ban đầu của các hộp
được nhập từ bàn phím. Mỗi hoán chuyển được nhập bằng số (thuộc từ 1 đến N-1) của
hai hộp liền nhau đầu tiên sẽ được đổi chỗ cho các hộp rỗng. Chương trình phải tìm và
báo cáo trạng thái các hộp sau khi hoán chuyển.
2. Cho trước hiện trạng các hộp, tìm ít nhất một cách hoán chuyển đạt mục tiêu cuối cùng
của bài toán. Chương trình phải báo cáo cả trạng thái ban đầu và trạng thái hiện tại sau
mỗi bước hoán chuyển.
3. Tìm những cách hoán chuyển để số hộp bị di chuyển ít nhất và vẫn đạt được mục đích.
Bài toán 2
Các tầng trong một tòa nhà được đánh số tuần tự từ 0, 1, 2, , N (N<=15). Trong tòa
nhà có tất cả K (1<=K<=4) thang máy. Thang máy được điều khiển từ một trung tâm và
chỉ chấp nhận hai lệnh được nhập vào bằng cách bấm nút. Các nút ngoài thang máy (một
nút ra lệnh lên và một nút ra lệnh xuống) có ở tất cả các tầng. Các nút trong (ra lệnh đến


một tầng cụ thể) có trong mỗi thang máy.
Hãy viết chương trình mô phỏng quá trình điều khiển thang máy với các lệnh sau:
1. Trong tòa nhà có một thang máy (K=1) và mỗi lần nó chỉ chấp nhận một lệnh.
Các lệnh khác chỉ được chấp nhận khi lệnh trước đó được hoàn thành.
2. Trong tòa nhà có nhiều thang máy (K>=1). Mỗi thang máy chỉ chấp nhận lệnh từ
nút trong nếu không có lệnh nào đang được xử lý. Thiết bị điều khiển có thể nhận nhiều
lệnh cùng lúc. Các lệnh trong luôn được thang máy thực hiện mỗi khi ra lệnh. Thiết bị
điều khiển sẽ chọn chiếc thang máy đang rỗi phù hợp nhất để thực hiện lệnh ngoài.
3. Xét trường hợp tương tự trong yêu cầu 2 với điều kiện các thang máy số chẵn chỉ có
thể dừng ở các tầng số chẵn và các thang máy số lẻ chỉ dừng ở các tầng số lẻ. Tất cả các
thang máy đều có thể dừng ở tầng 0.
4. Xét trường hợp trong yêu cầu 3 và giả sử tại mỗi thang máy có nhiều lệnh đang đợi
thực hiện. Tất cả các lệnh trong đều được chấp nhận dù cho thang máy có rỗi hay không.
Gợi ý:
Tất cả các thang máy đều đồng bộ và tại một điểm thời gian, các thang máy đều ở các
tầng cho trước nào đó.
Trong một khoảng thời gian tiếp theo, một thang máy có thể đi lên đi xuống hay ở
nguyên tầng cũ.
Các lệnh có thể nhập vào bất cứ lúc nào, các lệnh có định dạng sau:
a, Lệnh ngoài - <số tầng, hướng di chuyển (lên hoặc xuống)>;
b, Lệnh trong - <số tháng máy, số tầng>
Tại mỗi thời điểm có thể nhập nhiều lệnh hoặc không nhập lệnh nào.
Tại mỗi thời điểm chương trình báo vị trí của mỗi chiếc thang máy.
Thang máy đủ lớn và không bị quá tải.
Chương trình phải điều khiển thang máy sao cho tối ưu nhất.
Bài toán 3
Cho trước một nhóm N người. Mỗi người là bạn của hơn [N/2] người còn lại và là kẻ thù
của không quá K người. Một người có một cuốn sách mà tất cả mọi người đều muốn đọc
và thảo luận với một số người khác.
Hãy viết chương trình:

1. Tìm cách truyền tay nhau cuốn sách sao cho tất cả mọi người đều được đọc nó một
lần và chuyển nó cho bạn mình và cuối cùng cuốn sách về tay người chủ.
2. Chia nhóm người thành S tổ để thảo luận về cuốn sách. Mỗi người phải có không
quá P kẻ thù trong cùng tổ.
Giả sử S*P >= K.
Bài toán 4
Xét đoạn văn bản được soạn thảo bằng các ký tự viết hoa /A-Z/ và 8 ký tự . , + - : / ? !
Đoạn văn bản đó được gửi qua kênh giao tiếp dưới dạng chuỗi byte. Số ký tự 1 trong
mỗi byte phải là số chẵn.
1. Đưa ra cách mã hóa các ký tự trên bằng các chuỗi nhị phân sao cho cách mã hóa rõ
ràng và số bit được gửi qua kênh giao tiếp là ít nhất.
2. Hãy viết chương trình:
2.1. Cho trước đoạn văn bản, hãy in ra đoạn văn bản dưới dạng một chuỗi các số thập
lục phân.
2.2. Cho trước đoạn văn bản đã mã hóa nhận được, hãy giải mã và hiển thị đoạn văn
bản lên màn hình.
Bài toán 5
Xét một hình phẳng gồm n đỉnh, mỗi đỉnh đều bậc 3.
Ví dụ:

Để các đỉnh X,Y và Z liền kề đỉnh T. Ta nói Y là đỉnh lân cận trái và Z là đỉnh lân cận
phải của T tính theo X, nếu góc XTZ nhỏ hơn góc XTY.
Ví dụ, E là đỉnh lân cận phải và G là đỉnh lân cận trái của H tính theo A vì góc
AHE nhỏ hơn góc AHG.
Hãy viết chương trình:
1. Nhập tọa độ của các đỉnh và các cạnh của hình phẳng, hãy vẽ hình đó lên màn hình
theo một tỷ lệ phù hợp. Các cạnh được biểu diễn bằng các đoạn thẳng.
2. Cho trước một cặp đỉnh X0 và X1 và một chuỗi các ký tự L và R. Hãy tìm một
đường đi X0X1X2 Xn trên hình đó sao cho:
- X0 và X1 là hai đỉnh bắt đầu;

- Xi+1 là đỉnh lân cận trái hoặc đỉnh lân cận phải của Xi tính theo Xi-1 tuỳ theo
ký tự thứ (i-2) trong chuỗi điều khiển là L và R.
Ví dụ:
Đường đi tìm được trong ví dụ trên với A và H là các đỉnh bắt đầu và chuỗi LRRLLR là
AHGFEDCB.
3. Vẽ đường đi trong yêu cầu 2 lên màn hình.
4. Dùng một đỉnh bắt đầu và một đỉnh kết thúc, hãy vẽ một đường đi qua số đỉnh ít
nhất, vẽ đường đi đó lên màn hình và báo cáo các đỉnh bắt đầu cùng chuỗi điều khiển tạo
ra đường đi như trong yêu cầu 2.
Bài toán 6
Cho trước một đa giác có 20 cạnh. Các cạnh được đánh số từ 1 đến 20. Hãy tìm đường đi
trên hình đa giác 20 cạnh sao cho chỉ đến mỗi cạnh duy nhất 1 lần. Đường đi giá trị C
được định nghĩa là tích vô hướng:

trong đó fi là số cạnh đi qua ở bước thứ i.
Chỉ có thể đi từ cạnh này sang cạnh khác nếu hai cạnh đó nằm lân cận.
A. Hai cạnh lân cận nhau nếu có một đỉnh chung;
B. Hai cạnh lân cận nhau nếu có một đỉnh chung hoặc có một điểm chung.
Hãy tìm các đường đi có giá trị nhỏ nhất cho ví dụ trên.
Chú ý:
Vì tính phức tạp về thời gian và không gian của thuật toán nên bạn không cần tìm kết
quả chính xác mà chỉ cần đưa ra một kết quả tương đối.
Cuộc thi Olympiad Tin học Quốc tế
lần thứ hai được tổ chức tại
MINSK,BYELLORUSSIA năm 1990

Ngày thứ nhất

Bài toán 1. Hãy lập chương trình biến đổi bảng số trong hình A thành bảng số trong hình
B. Mỗi số trong một ô vuông có thể di chuyển đến một trong các ô trống khác; lúc này ô

vuông chứa số đó sẽ trở thành trống.
Bài toán 2
Trò chơi với các hộp, yêu cầu người chơi nối các chấm trên lưới. Người chơi hoàn thành
một hộp sẽ ghi được 1 điểm và chuyển đến lượt người kia. Trò chơi kết thúc khi lưới
được hoàn thành và người thắng cuộc là người nhiều điểm hơn. Chỉ cho phép nối khoảng
cách giữa hai điểm theo hàng ngang và hàng dọc. Ví dụ dưới minh họa trò chơi giữa Red
và Blue mới được hoàn thành một nửa:

Lưới trong trò chơi được minh họa bằng ký tự R và B chỉ các dòng tương ứng Red và
Blue điền được, còn số 0 chỉ dòng trống:

Trò chơi được thu gọn lại dưới dạng một ma trận như sau:
ROBR
BRBBB
BBRR
ROROO
OOOB
BOOOO
BORO
OROOR
OOOB
1. Hãy viết chương trình xét một ma trận như trên (là một lưới kích thước 5 x 5) và tìm số
hộp ba chiều (theo bất kỳ hướng nào). Dữ liệu vào được lưu trong một tệp có 9r dòng
minh họa r trò chơi, kết thúc phần mô tả mỗi trò chơi là một dòng chứa từ END. Chương
trình báo cáo kết quả của mỗi ma trận trên một dòng: Ma trận r chứa x hộp ba chiều.
2. Sửa lại chương trình, tiếp tục trò chơi chỉ dành cho Blue. Hãy hoàn thành nhiều hộp
nhất với một lần di chuyển. Không cần thực hiện lần di chuyển cuối cùng. Chương trình
phải báo cáo: x hộp được hoàn thành. Lần di chuyển cuối cùng = L, C trong đó L và C là
hàng và cột minh họa ký tự trong ma trận và x là số hộp mới được hình thành nhưng
không nằm trong số hộp được hoàn thành trong lưới.


Bài toán 3
Có N cuốn sách và 2 người A và B muốn đọc số sách đó. Các số nguyên dương A[I] và
B[I] là khoảng thời gian cần thiết để người đọc A (hoặc B) đọc cuốn sách I, 1<=I<=N.
Cả hai người đều bắt đầu đọc sách ở thời gian 0. Tại một thời điểm, hai người không đọc
cùng một cuốn sách. Cho trước số nguyên K (2<=K<=N) và các cuốn sách được đánh số
sao cho không người nào có thể bắt đầu đọc cuốn sách J, (2<=J<=K) cho đến khi cuốn
sách J-1 được cả hai người đọc xong. Thứ tự đọc các cuốn sách khác là tuỳ ý. Hai người
có thể không đọc liên tục tức là trong quá trình đọc sách, người đọc có thể dừng đọc ở
một thời điểm nguyên nào đó sau đó lại tiếp tục từ thời điểm ngừng đó. Trong khoảng
thời gian nghỉ đó, người đọc có thể đọc bất kì cuốn sách khác mà người đó chưa đọc
xong hoặc đọc tiếp một cuốn sách mới (hoàn toàn chưa đọc gì) mà người đó được quyền
đọc .

1. Dữ liệu vào được định dạng như sau:
< ENTER N > >
< ENTER K > >
< ENTER: >
< A[1] > > < B[1] > >
< A[2] > > < B[2] > >

< A[N] > > < B[N] > >
2. Hãy tìm thời gian T lớn nhất sao cho trước thời gian đó cả hai người đọc chưa đọc hết
tất cả các cuốn sách; dữ liệu ra t ính giá trị T.
3. Hãy xây dựng lịch trình đọc sách cho mỗi người thỏa mãn tất cả các ràng buộc trên và
quá trình đọc sách kết thúc ở thời gian T. Lịch trình đọc sách được định dạng như sau:
< Book > < Start > < Finish >


Bảng trên chứa tất cả các thời gian trong khi người A (hoặc B) đọc sách và số cuốn sách

được đọc.
4. Đưa ra số lần giành quyền đọc sách của mỗi người. Hãy cố gắng giảm số lần giành
quyền đọc.
Bài toán 4
Cho trước số nguyên K. Một mảnh giấy được chia thành N ô (K<=N<=40). Hai người
chơi chọn và lấy đi lần lượt K ô giấy trống liền nhau. Người chiến thắng là người lấy đi ô
giấy cuối cùng.
1. Nhập giá trị N và xác định xem người chơi thứ nhất có chiến thắng được không. Đưa
ra thông báo "Player 1 has winning strategy" hoặc "Player 1 doesn't have winning
strategy". ('Người chơi thứ nhất có thể chiến thắng' hoặc 'Người chơi thứ nhất không thể
chiến thắng').
2. Với N cho trước, hãy xác định xem người chơi thứ nhất có thể chiến thắng không nếu
lần chọn đầu tiên của anh ta được nhập từ bàn phím.
3. Hãy viết chương trình mô phỏng người chơi thứ hai với N cho trước và người thứ nhất
đi trước. Các nước đi của người chơi thứ nhất được nhập từ bàn phím. Các nước đi được
mô phỏng bằng chỉ số của ô giấy L (1<=L<=N-K+1). Các ô giấy từ L đến L+K-1 được
chọn và lấy đi trong quá trình chơi. Sau mỗi nước đi, vị trí hiện thời của trò chơi được in
ra theo mẫu:
1 2* 3* N
Chỉ số được in ra ở phía trên, các ô giấy bị lấy đi được đánh dấu bằng biểu tượng '*'. Khi
trò chơi kết thúc hãy in ra báo cáo 'Victory of Player 1 (Player 2)'. Khi nhập giá trị c ủa N
và K, in ra 'N>' và 'K>'. Khi nhập nước đi hãy in ra 'Move of Player 1>'.
Giả sử dữ liệu nhập vào là chính xác.
Bài toán 5. [ PROLAN/M ]
Giả sử công ty phần cứng NePhihhan đang phát triển một bộ vi xử lý mới mang tên RISC
có khả năng xử lý một kiểu thông tin đơn giản - chuỗi ký tự - và thực hiện một lệnh thay
thế đơn giản (tìm kiếm các chuỗi con và thay thế nó bằng các chuỗi con khác). Người ta
sử dụng hai vùng bộ nhớ, một vùng chứa chương trình (danh sách các mô tả các thay
thế), còn vùng kia (ta sẽ gọi là R với kích thước gần như không giới hạn) được dùng để
lưu trữ dữ liệu vào, các kết quả trung gian và kết quả cuối cùng.

Các chương trình điều khiển bộ vi xử lý được viết bằng ngôn ngữ được gọi là
PROLAN/M. Trước khi mô tả chính thức, ta xét chương trình ví dụ dưới:
(aa,b) (ba,a) (bc,a) (c,start) (d,) (b,finish) (,)
Khi xử lý chuỗi dữ liệu vào 'abcabcd', chương trình in chuỗi dữ liệu ra 'finish', còn nội
dung của R lần lượt là một trong các chuỗi abcabcd, aaabcd, babcd, abcd, aad, db, b,
finish.
Mô tả cú pháp chính thức của ngôn ngữ PROLAN/M (dùng "::=" để chỉ "được định nghĩa
là" và ":" để chỉ "hoặc"):

<'PROLAN/M'-program> ::= <substitut.sequence>(,)
<substitut.sequence> ::= <substitution>:
::= <substitut.sequence><substitution>
<substitution> ::= (<left part>,<right part>)
<left-hand part> ::= <string>
<right-hand part> ::= <string>:<empty>
<string> ::= <string symbol>:<string><string symbol>
<empty string> ::=
<string symbol> ::= <any ASCII character except ',' , ')' >

Sau khi chuỗi dữ liệu được nhập vào R, chương trình được thực hiện như sau: bộ vi xử
lý tìm kiếm <substitution> đầu tiên trong <substitut.sequence> trong đó <left-hand part>
là chuỗi con của chuỗi trong R. Nếu tìm kiếm thành công, <right-hand part> của cùng
<substitution> sẽ thay thế chuỗi con tương ứng trong R (chuỗi tận cùng bên trái nếu kết
quả tìm kiếm không là duy nhất). Thủ tục này được lặp lại từ đầu với giá trị R mới đến
khi <left-hand part> trong <'PROLAN/M'-program> được tìm thấy là một chuỗi con với
giá trị R hiện tại, đây là kết quả cuối cùng và quá trình xử lý kết thúc.

Câu 1.
Hãy viết và sửa lỗi một chương trình PROLAN/M chuyển một chuỗi kiểu
<nat.nr1>+<nat.nr2>=?

(trong đó <nat.nr1> và <nat.nr2> là các chuỗi số thập phân hiện thân là các số tự nhiên)
thành một chuỗi kiểu <nat.nr1>+<nat.nr2>=<nat.nr3> chứa đựng phát biểu toán học đúng
(<nat.nr1> và <nat.nr2> như nhau). Ví dụ, chuỗi 1990+123=? được chuyển thành
1990+123=2113 sau quá trình xử lý. Lưu chương trình của bạn vào tệp SUM.PRM.

Câu 2.
Viết chương trình sửa lỗi theo ngôn ngữ PROLAN/M thực hiện nhiệm vụ sau:
(a) Lưu tên tệp văn bản theo ngôn ngữ PROLAN/M;
(b) Tìm nội dung ban đầu của R;
(c) Biểu diễn quá trình chuyển chuỗi dữ liệu vào bằng chương trình trong tệp văn bản;
(d) hiển thị kết quả lên màn hình;
(e) Tìm sơ đồ chuyển đổi.
Bài toán 6
Cho trước các số nguyên a và n (n<100). Giả sử một ngôn ngữ lập trình tưởng tượng
chứa chỉ lệnh và phép nhân. Hãy viết chương trình tạo 1 văn bản bằng ngôn ngữ đó cho
biểu thức b=a^n, với số phép nhân ít nhất. Ví dụ dưới xét đoạn văn bản được tạo ra với
n=13, trong đó giữa cặp dấu {} chứa chú giải:
X1:=a; {=a}
X2:=X1*X1; {=a^2}
X3:=X2*X2; {=a^4}
X4:=X3*X1; {=a^5}
X5:=X3*X3; {=a^8}
X6:=X5*X4; {=a^13}
b:=X6;
Ngày thi thứ hai

Bài toán 1
Mỗi nhân viên bảo vệ trong một triển lãm nghệ thuật phải làm nhiệm vụ trong một
khoảng thời gian. Chương trình bảo vệ được biểu diễn bằng các cặp [T1(i),T2(i)] - chỉ
thời điểm bắt đầu và kết thúc ca làm việc của nhân viên bảo vệ thứ i. Cho trước một

chương trình bảo vệ, hãy:
(a) Kiểm tra xem có ít nhất hai người bảo vệ nào làm nhiệm vụ trong khoảng thời gian [0,
EndTime].
Nếu điều kiện (a) không thỏa mãn, hãy
(b) Xác định tất cả các khoảng thời gian thiếu nhân viên bảo vệ (ít hơn 2 người đang làm
nhiệm vụ).
(c) Xác định số nhân viên bảo vệ cần bổ sung ít nhất làm nhiệm vụ trong một khoảng thời
gian bắt buộc theo chương trình bảo vệ, ví dụ, bổ xung nhân viên thỏa mãn điều kiện (a).

INPUT
(Tất cả thời gian đều là số nguyên tính bằng phút)
EndTime - thời điểm kết thúc nhiệm vụ canh gác, triển lãm cần canh gác trong khoảng
thời gian [0, EndTime].
N - số nhân viên bảo vệ.
T1[i]. T2[i], i=1, , N - thời gian bắt đầu và kết thúc ca trực của nhân viên thứ i.
Length - thời gian làm việc bắt buộc đối với một nhân viên bổ sung.

OUTPUT
(1) Câu trả lời cho yêu cầu (a) theo định dạng "Yes/No".
(2) Nếu câu trả lời trước là "no", hãy kiệt kê các cặp số (k,1) - chỉ thời gian bắt đầu và kết
thúc của tất cả các khoản thời gian thiếu nhân viên bảo vệ và số số nhân viên thiếu trong
mỗi khoảng thời gian đó (0 hoặc 1 người).
(3) Số nhân viên bổ sung và danh sách các thời gian bắt đầu và kết thúc trong khoảng
thời gian bắt buộc của mỗi nhân viên bổ sung.
Bài toán 2
N đoạn được đặt trên mặt phẳng theo tọa độ các điểm cuối, N>0. Các điểm cuối của một
đoạn được biểu diễn bằng hai cặp (x1[i], y1[i]) và (x2[i], y2[i]), 1<=i<=N. Điểm cuối của
một đoạn bất kỳ đều thuộc đoạn đó. Hãy viết chương trình để:
1. Biểu diễn dữ liệu vào theo mẫu
<Nhập giá trị N số đoạn :>

<Nhập tọa độ của đoạn thứ i:>
x1[1] > y1[1] >
x2[1] > y2[1] >
::: :::
2. Hãy tìm đường thẳng có chứa các điểm chung với nhiều đoạn thẳng nhất có thể. Báo
cáo kết quả theo thứ tự tăng dần số đoạn thẳng chứa các điểm chung với đ ường thẳng
này.
Bài toán 3
Các điểm nút đánh số từ 1 đến N (N<=50) được nối với nhau bằng một hệ thống đường
phố, trong đó mỗi đường phố đều có chiều bằng 1. Các đường phố có độ cao khác nhau
và chỉ cắt nhau ở các điểm nút. Tại thời điểm ban đầu 0 có một số robot ở một số nút.
Tổng số robot là M (M = 2 hoặc 3). Các robot di chuyển liên tục từ nút này đến khác một
cách độc lập nhau và có thể thay đổi hướng di chuyển tại các nút. Các robot không được
dừng lại. Vận tốc của robot thứ i là speed[i] (speed[i] = 1 hoặc 2).
Các robot được điều khiển theo cách sao cho tổng thời gian để các robot gặp nhau là ít
nhất. Hãy xác định thời gian T nhỏ nhất để sau đó tất cả các robot có thể gặp nhau tại 1
điểm, hoặc nếu không xác định thời gian T nhỏ nhất để các robot không thể gặp nhau tại
cùng một điểm với bất kỳ thời gian t >= 0 nào.
Định dạng dữ liệu vào như sau:
<Nhập vào N:>
<Nhập số đường phố K:>
< Đường 1 nối với các điểm:>

< Đường K nối với các điểm:>
(Các cặp điểm được nhập vào: I J)
<Nhập số robot M:>
<Vận tốc của robot 1:>

<Vận tốc của robot 1:>
<Vị trí ban đầu của robot 1:>


<Vị trí ban đầu của robot 1:>
(Tất cả các số trên đều là số nguyên không âm)
Định dạng dữ liệu ra như sau:
<Thời gian = >
Bài toán 4
Tất cả các con phố của một thành phố dạng hình chữ nhật nằm trên một vùng không bằng
phẳng. Các con phố được ký hiệu từ Nam ngược lên Bắc (các phố N) hoặc từ Tây sang
Đông (các phố M), do đó thành phố được chia thành các ô vuông với kích thước đều
bằng 1. Các đoạn phố nằm giữa hai điểm giao liền nhau chỉ chạy theo xuống hoặc lên
hoặc có thể nằm ngang. Ma trận K[y,x] (kích thước M x N) chứa độ cao của các điểm
giao cắt so với mực nước biển.
Hãy viết chương trình thực hiện:
1. Nhập kích thước ma trận M và N.
2. Nhập các phần tử của ma trận H[i,j]; (i=1,M , j=1,N).
3. Nhập tọa độ của hai điểm giao A và B.
4. Trả lời câu hỏi: Có thể đi từ A sang B hoặc từ B sang A mà chỉ đi theo hướng xuống?
Nếu câu trả lời với dữ liệu câu 3 là luôn khẳng định, chương trình còn phải:
5. Xác định ít nhất một đường đi như vậy và hiển thị tọa độ của điểm giao lên màn hình.
6. Xác định tất cả các đường đi như vậy.

Cuộc thi Olympiad Quốc tế môn Tin
học lần thứ ba tổ chức tại ATHENS,
GREECE từ ngày 19 đến ngày 25
tháng 5 năm 1991
I. Bài toán chơi bài
Một bộ bài gồm 52 quân với 13 giá trị khác nhau: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, J, Q, K và
bốn chất khác nhau: Bích, Nhép, Rô và Cơ (quân Bích và quân Nhép màu đen, quân Rô
và quân Cơ màu đỏ). Sau khi xáo kỹ bộ bài, ta lần lượt rút 12 quân và xếp thành 3 hàng
mỗi hàng 4 quân trên bàn.

Trong những lần này, nếu ta rút được các quân J, Q hoặc K, ta đặt các quân đó xuống
cuối bộ bài và tiếp tục rút cho đến khi đủ 3 hàng mỗi hàng 4 quân. Ta tiếp tục kiểm tra
những quân bài đã xếp trên bàn xem có các cặp bài có tổng giá trị bằng 10. Nếu có hai
quân bài với mỗi quân có giá trị bằng 10, ta coi một trong hai quân đó có giá trị là 0 (tức
là với hai quân 10 ta coi như một cặp có tổng giá trị bằng 10).
Trong số những cặp bài trên bàn, ta đặt hai quân bài trong bộ còn lại, mỗi quân lên một
quân trong cặp đó. Trong quá trình đặt, nếu ta rút ra được một trong các quân J, Q hoặc
K, ta đặt quân bài đó lên một quân trong cặp và quân này không được tham gia vào bất
kỳ một thủ tục nào khác.
Quá trình được tiếp tục thực hiện đến khi toàn bộ mặt 12 quân bài đều là J, Q, K hoặc
không còn cặp nào có tổng giá trị bằng 10.
Hãy viết chương trình mô phỏng quá trình trên với những yêu cầu sau:
1. Số N - số lần lặp lại thủ tục trên phải được nhập từ bàn phím. Khi N = 1, một trong các
trường hợp 2,3 và 4 dưới đây xảy ra.
2. (a) Bộ bài phải được tạo mới, với mỗi lần lặp lại chương trình phải xáo lại bài.
(b) Bộ bài được hiển thị ra màn hình.
3. (a) 12 quân bài hiển thị trên màn hình theo quá trình mô tả trên.
(b) Các quân bài còn lại trong bộ bài phải được hiển thị trên màn hình.
4. (a) Các quân bài bị phủ lên trong quá trình trên phải được thay bằng các quân bài thay
chúng và phải được hiển thị trên màn hình.
(b) Sau mỗi lần thay thế, các quân bài còn lại trong bộ cũng được hiển thị trên màn
hình.
5. Sau 5 lần lặp lại, cần phải đưa ra một biểu đồ mà trong đó sẽ hiển thị số quân bài còn
lại trong bộ bài sau khi kết thúc mỗi thủ tục.
II. Bài toán rào cây
Một nông dân muốn bảo tồn một loại cây bách cổ quý hiếm. Để làm điều này, ông ta ghi
nhớ vị trí của mỗi cây và quyết định dùng dây kim loại rào quanh cây theo một hình đa
giác để cây nằm toàn bộ trong đó. Để giảm chi phí, ông ta cần tính chiều dài dây kim loại
tối thiểu nhất. Người nông dân muốn xây một ngôi nhà hình chữ nhật, một trong các cạnh
nhà song song với trục X và ông ta cần biết vị trí tương đối của ngôi nhà:

(1) Ngôi nhà nằm bên ngoài hàng rào hình đa giác.
(2) Ngôi nhà nằm trong hàng rào hình đa giác.
(3) Hàng rào chia ngôi nhà thành hai phần có diện tích khác 0.
Hãy viết chương trình thực hiện các công việc sau:
(A) Tìm các cây nằm ở đỉnh đa giác.
(B) Tính chiều dài của dây kim loại cần sử dụng.
(C) Chỉ ra vị trí của ngôi nhà trong ba trường hợp (1,2,3) trên.
Dữ liệu vào:
- Dòng đầu tiên là N - số cây (N <= 20).
- N dòng tiếp theo, mỗi dòng là hai số (Xi,Yi), 1 <= i <= N, Xi, Yi > 0 - là tọa độ của cây
thứ i.
- Dòng cuối cùng là các số (a,b), (c,d); a, b, c, d > 0 - cho biết toạ độ điểm bắt đầu và kết
thúc của đường chéo ngôi nhà.
Kết quả:
- Đưa ra một dãy M điểm (1 <= M <= N) với tính chất là nếu ta đi theo các điểm này theo
thứ tự mà chúng xuất hiện, ta sẽ được một hình đa giác ngoài (đa giác gồm M đỉnh là vị
trí của M cây và bao quanh toàn bộ N điểm - vị trí của N cây).
- Chiều dài kim loại cần sử dụng.
- Vị trí ngôi nhà theo dạng "1","2" hoặc "3".
III. Liệt kê các vị trí trong ma trận vuông 5 x5
Liệt kê các vị trí trong ma trận kích thước 5x5 theo cách sau: nếu số i (1<=i<=25) được
gán cho một vị trí trong ma trận với tọa độ (x,y), thì số i+1 có thể được gán cho một vị trí
trong ma trận với tọa độ (z,w) theo một trong các quy tắc sau:
(1) (z, w) = (x+-3, y)
(2) (z, w) = (x, y+-3)
(3) (z, w) = (x+-2, y+-2)
Bài toán đặt ra như sau:
(A) Hãy viết chương trình liệt kê các vị trí trong một ma trận kích thước 5x5 bắt đầu từ
vị trí số 1.
(B) Liệt kê số vị trí có thể từ một điểm bắt đầu bất kỳ ở phần trên bên phải ma trận, bao

gồm cả đường chéo chính.
Ví dụ: Nếu vị trí trong ma trận có tọa độ (2,2) được chọn làm điểm bắt đầu thì vị trí tiếp
theo được gán số 2 sẽ là một trong các vị trí với tọa độ: (2,5) hoặc (5,2) hoặc (4,4). Các vị
trí đó được đánh dấu hoa thị (*) trong hình 1.
Chú ý: Bài làm được đánh giá tốt nếu kết quả ra trông giống như trong hình 1.
IV. Ngôn ngữ
Cho trước một tệp văn bản ASCII chứa một đoạn văn bản mà ngôn ngữ dùng không được
biết đến mà chỉ nhận biết đặc điểm là các ký tự Latin.
Bài toán đặt ra
Phân tích nội dung của tệp văn bản để xác định ngôn ngữ được sử dụng (tiếng Anh, Pháp
hoặc Đức, ).
(A) Hãy viết chương trình đọc nội dung tệp và đếm số ký tự trong đó. In ra tổng số ký tự.
(B) Sửa chương trình trong yêu cầu (A) thành chương trình còn có thể đếm số lần xuất
hiện của mỗi ký tự (các dấu chấm câu coi như ký tự trống, không phân biệt chữ cái
thường, chữ cái hoa ). Các ký tự chỉ nằm trong tập [' ','A' 'Z'].
Sắp xếp các ký tự theo tần số xuất hiện giảm dần và in danh sách đó ra.
(C) Sửa chương trình trong yêu cầu (B) để có thể xác định tần số xuất hiện của các ký tự.
Tiêu chuẩn hóa việc đếm, ví dụ chia tần số xuất hiện của mỗi ký tự cho tổng số ký tự đã
đọc sẽ được tỷ lệ xuất hiện tương đối phụ thuộc vào tổng số ký tự trong văn bản. Viết tỷ
lệ này vào tệp dữ liệu.
(D) Mở rộng chương trình ở (C) sao cho nó có thể đọc tệp văn bản và so sánh nó với một
văn bản bằng một ngôn ngữ đã biết. Phương pháp so sánh do bạn tự nghĩ ra. Kết quả báo
cáo ra cần cho biết ngôn ngữ sử dụng để viết văn bản ban đầu.
V. S-TERMS
S-term là một chuỗi gồm các ký tự S và dấu ngoặc đơn được định nghĩa một cách đệ quy
như sau: S là một S-term, và nếu M và N là các s-term, thì (MN) cũng là một s-term.
Ví dụ:
((((SS)(SS))S)(SS))
Các dấu ngoặc đơn bên phải không chứa thông tin gì mới, do đó có thể bỏ chúng đi, ví dụ
(MN thay cho (MN), do đó chuỗi ban đầu trở thành:

((((SS(SSS(SS
1. Hãy viết một thủ tục "tạo chuỗi" để tạo ra các S-term: thủ tục của bạn phải sinh ra n (n
= độ dài = số ký tự S trong chuỗi) tệp văn bản chứa tất cả các S-term có độ dài lần lượt là
1, , n. Các S-term được ngăn cách bằng dấu chấm phảy";". Kết thúc S-term cuối cùng
trong mỗi tệp văn bản là một dấu chấm".".
Hãy viết chương trình nhập một số nguyên N (<=10), sử dụng thủ tục trên để hiển thị tất
cả các S-term trên màn hình.
Xét một phép tính với các S-term. Quy tắc S duy nhất được sử dụng là: bất kỳ chuỗi con
nào của một S-term có dạng (((SA)B)C), trong đó A, B và C là các s-term đều có thể viết
dưới dạng: ((AC)(BC)).
ứng dụng của quy tắc này trên một S-term được gọi là rút gọn S-term.
Có nhiều cách khác nhau để chọn một chuỗi con để áp dụng quy tắc S. Một ứng dụng
khác của quy tắc trên với một S-term được gọi là "chuẩn hóa" S-term.
Ví dụ về một chuỗi thu nhỏ:
((((SS)(SS))S)(SS)) -> (((SS)((SS)S))(SS)) -> ((S(SS))(((SS)S)(SS))) -> ((S(SS))((S(SS))
(S(SS))))
2. Chọn một cấu trúc dữ liệu phù hợp để biểu diễn S-term có thể hỗ trợ áp dụng quy tắc
S. Hãy viết hai thủ tục "đọc chuỗi" và "in chuỗi" chuyển S-term từ cách biểu diễn "tạo
chuỗi" sang cách biểu diễn của bạn và ngược lại. Chương trình của bạn phải thể hiện
được quá trình chuyển đó.
3. Hãy viết thủ tục "thu nhỏ" biểu diễn một bước thu nhỏ theo quy tắc S trên một chuỗi
con của một S-term. Chương trình phải minh họa được điều này.
4. Hãy viết thủ tục "chuẩn hóa": cho trước một S-term, hãy chọn một chuỗi con để áp
dụng quy tắc S đến khi không thu nhỏ được nữa hoặc khi số lần thu nhỏ đã vượt quá mức
tối đa, ví dụ 30. Chương trình phải minh họa được quá trình này.
5. Cuối cùng, kết hợp tất cả các thủ tục trên thành một chương trình có thể:
a) yêu cầu người dùng nhập độ dài n,
b) Dùng các S-term độ dài n do quy trình "tạo chuỗi" tạo ra,
c) Chuyển các S-term sang cách biểu diễn của bạn,
d) Chuẩn hóa (nếu có thể),

e) Ghi ra kết quả chuẩn hóa các s-term,
f) Ghi ra số bước thu nhỏ với mỗi s-term, hoặc đoạn thông điệp 'not normalized' khi
không chuẩn hóa được sau 30 bước, Và
g) Báo cáo tỉ số giữa số lần không chuẩn hóa được trên tổng số của S-term với độ dài n
cho trước.
VI. Nhóm tội phạm đông nhất
Một cảnh sát trưởng biết rõ về số tội phạm trong thành phố mình quản lý cũng như tất cả
những người cộng tác với chúng. Hãy xác định tất cả các nhóm tội phạm có thể trong
thành phố.
Trong trường hợp này, nhóm tội phạm là một bộ phận của tất cả những kẻ phạm tội.
Nhóm tội phạm lớn nhất là không còn nhóm nào có số phần tử đông hơn nhóm này.
Hãy viết chương trình thực hiện các công việc sau:
(A) Nhập dữ liệu của cảnh sát trưởng với số tội phạm không quá 41 người. Dữ liệu ra là
một tệp văn bản ASCII có cấu trúc như sau:
a(1,1)
a(2,1)a(2,2)
a(3,1)a(3,2)a(3,3)

a(n,1)a(n,2)a(n,3) a(n,n)
Trong đó a(i,j) = 1, nếu người i cộng tác với người j hoặc i = j, và a(i,j) = 0 nếu ngược lại.
Ví dụ trong trường hợp có 6 người:
1
01
101
1011
01101
101111
Trong ví dụ này, kết quả ra sẽ là một trường hợp sau:
Nhóm tội phạm đông nhất là: 1 3 4 6 (tổng số phần tử trong nhóm là 4)
(B) Mở rộng phần dữ liệu vào của chương trình để tạo dữ liệu theo cách ngẫu nhiên với

số nhóm cộng tác 0 < d < 1.
(C) Dùng dữ liệu ngẫu nhiên hoặc tệp file dữ liệu vào, tìm nhóm tội phạm đông nhất
trong thành phố. Kết quả ra tương tự trong ví dụ trên (yêu cầu câu A).

VII. Gặp gỡ với các bác sỹ
Một trình dược viên muốn có một chương trình có thể lập kế hoạch cho tất cả các cuộc
hẹn gặp của anh ta và giúp anh ta trong một ngày có thể gặp càng nhiều bác sỹ càng tốt
để giới thiệu các sản phẩm y tế mà công ty của anh ta cung cấp. Hãy viết chương trình
thực hiện yêu cầu trên. Dữ liệu vào gồm nhiều dòng, mỗi dòng chứa tên một bác sỹ, điểm
bắt đầu và kết thúc của khoảng thời gian bác sỹ đó có thể gặp trình dược viên và tên bệnh
viện.
Quy tắc lên kế hoạch cho cuộc hẹn như sau:
1. Một cuộc gặp dài ít nhất 70 phút, trình dược viên cần ít nhất 30 phút giữa hai cuộc
hẹn để di chuyển giữa hai nơi.
2. Tất cả thời gian trong dữ liệu vào đều nằm trong ngày, và trình dược viên không được
gặp một bác sỹ hai lần trong ngày.
3. Hai cuộc hẹn gặp liền nhau không diễn ra ở cùng một bệnh viện.
4. Trong số các bác sỹ, trình dược viên thích đến bác sỹ có thể gặp sớm nhất.
5. Nếu có hơn một bác sỹ có thể gặp cùng một lúc, trình dược viên thích gặp bác sỹ có
thời gian còn lại trong ngày ít hơn (nhưng tất nhiên thời gian còn lại này đủ lớn hơn 70
phút).
6. Để có thể gặp càng nhiều bác sỹ càng tốt, trình dược viên luôn nghĩ đến thời gian bắt
đầu của cuộc hẹn tiếp theo, do đó nếu cần, anh ta có thể chấm dứt cuộc gặp đang diễn ra
ngay sau khoảng thời gian 70 phút để được 30 phút đi đường và chuẩn bị cho cuộc gặp
tiếp.
7. Nếu không vội vì cuộc gặp tiếp theo, trình dược viên có thể gặp bác sỹ đến lúc nào
anh ta muốn.
Dữ liệu vào: gồm nhiều dòng, mỗi dòng chứa các thông số của một bác sỹ được mô tả
như sau: tên của bác sỹ (theo tiếng Anh), một ký tự trống, điểm thời gian (giờ, phút, giây)
chỉ thời điểm có thể bắt đầu một cuộc hẹn gặp, một dấu gạch ngang ('-'), điểm thời gian

cuối cùng có thể bắt đầu cuộc gặp, tên bệnh viện của bác sỹ đó (theo tiếng Anh). Dữ liệu
vào không chứa các dòng trống.
Ví dụ, dữ liệu vào có dạng sau:
Bob 16.00-17.25 Cross
John 09.30-11.50 Health
Charles 11.00-20.00 Chest
Don 08.00-13.20 Cross
Norman 22.00-23.05 Brain
Jerry 10.00-17.00 Health
Charles 09.20-10.40 Orthopedic
Evelyn 19.15-20.40 Orthopedic
Peter 09.35-11.55 Brain
Don 18.00-20.00 Eye
Kết quả ra: chứa một bảng liệt kê danh sách các cuộc gặp theo thứ tự thời gian. Bảng
gồm các dòng chứa điểm thời gian bắt đầu và kết thúc của các cuộc hẹn gặp, địa điểm
gặp (tên bệnh viện) và tên bác sỹ. Ví dụ, kết quả ra tương ứng với ví dụ trên có dạng sau:
08.00-09.10 Cross Don
09.40-10.50 Health John
11.20-12.30 Chest Charles
13.00-15.30 Health Jerry
16.00-17.25 Cross Bob
19.15-20.40 Orthopedic Evelyn
8. Giải bài toán trên với hai trình dược viên A và B theo đúng quy tắc trên và thêm giới
hạn sau: họ không cùng gặp một bác sỹ. Mỗi khi có sẵn cuộc gặp thì người gặp sẽ là trình
dược viên có khoảng thời gian rỗi dài hơn. Nếu cả hai trình dược viên đều có khoảng thời
gian rỗi như nhau, A sẽ thực hiện cuộc gặp đó. Kết quả ra gồm hai danh sách các cuộc
gặp.


Cuộc thi Olympiad Quốc tế môn Tin

học lần thứ tư tổ chức tại Bonn,
Germany, tháng 7 năm 1992
1. Khám phá bản đồ
Một bản đồ hình chữ nhật có kích thước theo hệ tọa độ là 48 x 16. Hai tọa độ được gọi là
nối với nhau nếu chúng liền nhau theo cả hướng Bắc-Nam và hướng Đông-Tây. Ban đầu,
mỗi tọa độ chỉ được biết là Mặt nước W (WATER) hoặc Đất liền G (GROUND).
Có bốn kiểu tọa độ Đất liền (GT): G, M, P và C. Và có bốn kiểu tọa độ Mặt nước (WT):
W, O, B và L. Giả sử bên ngoài bản đồ là Đại dương (O).
Các quy tắc địa lý cho việc chuyển kiểu tọa độ, có thể là một:
- Núi (M): Nếu 1 tọa độ GT được nối với 4 tọa độ GT khác.
- Bán đảo (P): Nếu 1 tọa độ GT được nối với 3 tọa độ WT; hoặc 2 tọa độ WT và ít nhất 1
tọa độ P; hoặc 1 tọa độ WT và ít nhất 2 tọa độ P.
- Bờ biển (C): Nếu 1 tọa độ GT không phải là tọa độ M hay P.
- Đại dương (O): Nếu 1 tọa độ WT nối với ít nhất một tọa độ O.
- Vịnh (B): Nếu 1 tọa độ O được nối với ít nhất 2 tọa độ B và nhiều nhất 1 tọa độ O, hoặc
với 1 tọa độ B và ít nhất 2 tọa độ GT, hoặc ít nhất 2 tọa độ GT và ít nhất 1 tọa độ O.
- Hồ (L): Nếu 1 tọa độ W không đổi đến khi không thực hiện được phép chuyển kiểu tọa
độ nào nữa.
Điều này có thể xảy ra sau khi một tọa độ cụ thể đã được chuyển kiểu thì nó có thể được
chuyển kiểu một lần nữa vì kiểu của một số tọa độ lân cận có thể thay đổi trong lúc đó.
Một bản đồ được khám phá nếu không thực hiện được phép chuyển tọa độ nào nữa.
Yêu cầu: Hãy viết chương trình thực hiện công việc sau:
1. Đọc bản đồ một lục địa chưa được biết đến từ tệp dữ liệu vào theo định dạng ASCII và
hiển thị nó lên màn hình cùng với kiểu tọa độ ban đầu như trong ví dụ 1.
2. Khám phá bản đồ và đổi kiểu tọa độ với M, P, C, O, B hoặc L theo quy tắc địa lý.
3. Hiển thị bản đồ đã được khám phá lên màn hình với kiểu tọa độ cuối cùng như trong ví
dụ 2.
4. Viết một bản sao màn hình biểu diễn bản đồ đã được khám phá và kiểu tọa độ cuối
cùng trong một tệp kết quả ra định dạng ASCII.
Yêu cầu kỹ thuật

Yêu cầu 1: Lưu chương trình kết quả vào một tệp văn bản ASCII đặt tên là
"C:\IOI\DAY-1\411-PROG.xxx". Phần mở rộng .xxx là:
- .BAS với chương trình BASIC, .C với chương trình C,
- .LCN với chương trình LOGO, .PAS với chương trình PASCAL.
Yêu cầu 2: Tên tệp dữ liệu vào theo định dạng ASCII chứa bản đồ chưa dược khám phá
được lưu ở "C:\IOI\DAY-1\411-MAP.IN".
Yêu cầu 3: Tên tệp kết quả ra theo định dạng ASCII chứa bản đồ đã được khám phá và
các thống kê được lưu ở "C:\IOI\DAY-1\411-MAP.OU".
Ví dụ
Ví dụ 1: Màn hình hiển thị một bản đồ chưa được khám phá và kiểu tọa độ ban đầu:
G = 61, W = 707. Tổng cộng =768
Ví dụ 2: Màn hình hiển thị bản đồ đã được khám phá, gồm cả kiểu tọa độ cuối cùng:
P = 8, C = 47, M = 6, O = 685, B =17, L = 5, Tổng cộng =768
2. Mê cung
Một mê cung nằm trên một vùng kích thước N x M ô vuông. Mê cung gồm nhiều Bức
tường và nhiều Không gian, mỗi Không gian có một Lối vào và một Vật quý (đều được
biểu diễn bằng các ô vuông).
Một Đường đi là một chuỗi các ô vuông liền nhau (nằm giữa hai bức tường), Đường đi
bắt đầu bằng Lối vào và kết thúc tại một Điểm cuối. Chiều dài của Đường đi là số ô
vuông nằm trong nó gồm cả điểm đầu và điểm cuối.
Mê cung gồm các con đường phân nhánh nhưng không nối với nhau do đó hai con đường
bất kỳ không có cùng điểm cuối. Lối vào nằm ở một nơi nào đó ở đỉnh mê cung. Vật quý
nằm ở Điểm cuối Đường đi có độ dài lớn nhất.
Vùng kích thước N x M chứa số Đường đi tối đa có thể. Vì thuật toán thực hiện rất nhanh
nên cần có Thời gian chờ sau mỗi lần qua một ô vuông.
Yêu cầu: Viết bộ công cụ thực hiện các công việc với mê cung. Các công cụ có thể thực
hiện theo thứ tự khác nhau:
Công cụ 1: Thiết lập các tham số chính N và M của mê cung.
Công cụ 2: Thiết lập Thời gian chờ.
Công cụ 3: Tạo ngẫu nhiên một mê cung mới và hiển thị trên màn hình khi đang được tạo

ra.
Công cụ 4: Lưu mê cung được tạo ra và đường dẫn kích thước vào một tệp văn bản
ASCII như trong hình 2.
Công cụ 5: Đọc một mê cung chưa biết đến từ tệp văn bản ASCII và nhấn mạnh đường
dẫn từ Lối vào đến Vật quý.
Yêu cầu kỹ thuật
Yêu cầu 1: Biểu diễn mỗi ô vuông bằng một chuỗi hai ký tự:
- Bức tường bằng 2 lần chuỗi ký tự ASCII #219 "[["
- Đường đi và Lối đi bằng hai ký tự trống " "
- Vật quý bằng ký tự T và ký tự trống "T "
- Đường đi được nhấn mạnh bằng dấu chấm câu và ký tự trống ". "
Yêu cầu 2: 2 < N và M < 20.
Yêu cầu 3: Lưu chương trình vào một tệp văn bản ASCII có tên
"C:\IOI\DAY-1\412-PROG.xxx". Phần mở rộng .xxx là:
- .BAS với chương trình BASIC, .C với chương trình C,
- .LCN với chương trình LOGO, .PAS với chương trình PASCAL.
Yêu cầu 4: Tên tệp văn bản ASCII để đọc và lưu các mê cung là
"C:\IOI\DAY-1\412-MAZE.IO"
Ví dụ
Ví dụ 1: Hiển thị tệp "C:\IOI\DAY-1\412-MAZ1.IO" theo công cụ 5 lên màn hình:
N = 10, M = 8, Thời gian chờ = 100
Length = 13
Ví dụ 2: File kết quả ra tương tự theo công cụ 4:
10 8
3. Xây dựng bản đồ đảo trên biển
Biển được biểu diễn bằng một lưới kích thước N x N. Mỗi hòn đảo là một dấu "*" trên
lưới. Hãy xây dựng một bản đồ đảo từ các thông tin đã được mã hóa mô tả sự phân bố
đảo theo hàng ngang và hàng dọc. Để minh họa, hãy xét ví dụ dưới:
Các số ở bên phải mỗi hàng chỉ thứ tự và kích thước của nhóm đảo trên hàng đó. Ví dụ,
"1 2" ở hàng 1 nghĩa là trên hàng đó có một nhóm gồm một hòn đảo và một nhóm gồm

hai hòn đảo. Tương tự, chuỗi số ở bên dưới "1 1 1" ở cột 1 nghĩa là có ba nhóm với mỗi
nhóm có một hòn đảo.
Yêu cầu: Viết chương trình đọc tệp dữ liệu vào gồm nhiều khối dữ liệu thực hiện lặp lại
các bước dưới đây:
1. Đọc các khối dữ liệu liên tiếp từ tệp dữ liệu vào theo ASCII (với cấu trúc như trong ví
dụ dưới) và hiển thị lên màn hình. Mỗi khối dữ liệu chứa kích thước lưới ô vuông, sau đó
đến các ràng buộc hàng và ràng buộc cột. Mỗi ràng buộc với một hàng hoặc một cột nằm
trên một dòng riêng dưới dạng các chuỗi số được ngăn cách bằng ký tự trống và kết thúc
bằng số 0.
2. Xây dựng lại bản đồ và hiển thị chúng lên màn hình.
3. Lưu các bản đồ vào cuối một tệp kết quả kiểu ASCII. Mỗi chỗ trống được biểu diễn
bằng hai ký tự trống. Mỗi hòn đảo được biểu diễn bằng một dấu '*' sau đó đến một ký tự
trống. Các bản đồ khác nhau thỏa mãn cùng điều kiện được ngăn cách bằng một dòng
trống. Nếu không có bản đồ nào thảo mãn điều kiện, hãy in ra dòng "No map". Lời giải
cho mỗi khối dữ liệu khác nhau được ngăn cách bằng một dòng "next problem".
Yêu cầu kỹ thuật
Yêu cầu 1: 1 < N < 8.
Yêu cầu 2: Lưu lời giải vào tệp văn bản ASCII tên là
"C:\IOI\DAY-1\413-PROG.xxx". Phần mở rộng .xxx là:
- .BAS với chương trình BASIC, .C với chương trình C,
- .LCN với chương trình LOGO, .PAS với chương trình PASCAL
Yêu cầu 3: Tệp văn bản ASCII chứa các thông tin mã hóa được lưu trong
"C:\IOI\DAY-1\413-SEAS.IN".
Yêu cầu 4: Tệp kết quả ra chứa các bản đồ được lưu trong
"C:\IOI\DAY-1\413-SEAS.OU".
Ví dụ
6 Ví dụ 1: Kích thước lưới là 6.
1 2 0 < Bắt đầu dòng đầu tiên của ràng buộc
3 1 0
1 1 1 0

5 0
2 1 1 0
1 0
1 1 1 0 < Bắt đầu cột đầu tiên của ràng buộc
1 2 0
4 0
2 3 0
2 0
1 2 0
(*************************************************)
4 Ví dụ 2. Lời giải: các cột: 1 2 3 4
0 hàng 1:
1 0 hàng 2: *
2 0 hàng 3: * *
0 hàng 4:
0
1 0
2 0
0

2 Ví dụ 3. Nếu không có bản đồ thỏa mãn ràng buộc.
0
0
2 0
2 0

2 Ví dụ 4. Có hai bản đồ cùng thỏa mãn ràng buộc.
1 0
1 0
1 0

1 0
1. Chu trình Hamilton của Robot
Trên máy bay có tất cả N vị trí P1, P2, , PN với tọa độ nguyên (X1,Y1), (X2,Y2), ,
(XN,YN).
Một robot sẽ di chuyển qua tất cả các vị trí bắt đầu từ điểm P1. Nó chỉ qua mỗi vị trí một
lần trừ vị trí P1, đây cũng là điểm kết thúc của chuyến đi.
Di chuyển của robot tuân theo một số ràng buộc sau. Nó chỉ có thể di chuyển theo đường
thẳng. Từ điểm P1 nó có thể di chuyển theo bất kỳ hướng nào. Đến một trong các điểm
Pi, trước khi đến điểm khác, robot phải quay sang phải hoặc trái một góc 90 độ.
Một chương trình cho robot mô tả gồm 5 trạng thái sau:
1. "ORIENTATION Xk Yk": được dùng cho trạng thái đầu tiên. Robot quay sang hướng
đến vị trí Pk (k nằm giữa 2 và N).
2. "MOVE-TO Xj Yj": nếu robot có thể đến điểm Pj mà không cần thay đổi hướng đi
hiện tại, thì nó sẽ đi đến vị trí Pj (j nằm giữa 1 và N). Nếu không trạng thái này không
thực hiện được.
3. "TURN-LEFT": robot chuyển hướng đi sang trái một góc 90 độ.
4. "TURN-RIGHT": robot chuyển hướng đi sang phải một góc 90 độ.
5. "STOP": cho robot dừng lại. Đây là lệnh cuối cùng phải có trong một chương trình
hoạt động cho robot.
Yêu cầu: Hãy viết chương trình thực hiện các nhiệm vụ sau:
1. Đọc giá trị của N và tọa độ của N vị trí cho trước từ một tệp ASCII (xem ví dụ) và
hiển thị dữ liệu lên màn hình.
2. Phát triển chương trình điều khiển robot thực hiện một chuyến đi qua tất cả các vị trí
nếu có tồn tại.
3. Nếu không tồn tại chuyến đi đó, chương trình robot phải chứa lệnh "STOP".
4. Nếu có tồn tại chuyến đi qua được tất cả các vị trí, hãy hiển thị lên màn hình chiều dài
lộ trình đi (làm tròn đến 2 chữ số sau dấu thập phân). Chiều dài lộ trình đi là tổng chiều
dài của các đường thẳng robot đi qua.
5. Viết chương trình điều khiển robot vào một tệp kết quả theo bảng mã ASCII như trong
ví dụ dưới.

Yêu cầu kỹ thuật
Yêu cầu 1: Lưu chương trình kết quả vào một tệp văn bản ASCII với tên:
"C:\IOI\DAY-2\421-PROG.xxx". Phần mở rộng .xxx là:
- .BAS với chương trình BASIC, .C với chương trình C,
- .LCN với chương trình LOGO, .PAS với chương trình PASCAL
Yêu cầu 2: Tên tệp input là "C:\IOI\DAY-2\421-ROBO.IN".
Yêu cầu 3: Tên tệp output là "C:\IOI\DAY-2\421-ROBO.OU".
Yêu cầu 4: Chương trình loại bỏ các giá trị input N nhỏ hơn 4 hoặc lớn hơn 16.

Ví dụ
Input: Dòng đầu tiên chứa giá trị N và N dòng sau đó chứa tọa độ X và Y của các vị trí
theo ví dụ:
4
2 -2
0 2
-1 -1
3 1
Output: Với 4 vị trí đó, chương trình điều khiển robot ngắn nhất với chiều dài 12,65 là:
ORIENTATION 3 1
MOVE-TO 3 1
TURN-LEFT
MOVE-TO 0 2
TURN-LEFT
MOVE-TO -1 -1
TURN-LEFT
MOVE-TO 2 -2
STOP
2. Câu lạc bộ leo núi
Một câu lạc bộ leo núi có P thành viên được đánh số từ 1 đến P. Tất cả các thành viên
đều leo núi với cùng vận tốc; vận tốc leo và vận tốc leo xuống là như nhau. Vận động

viên leo núi i mỗi ngày dùng hết C(i) đơn vị đồ dùng và anh ta có thể mang theo toàn bộ
số đồ dùng S(i) được cấp đó. C(i) và S(i) đều là số nguyên.
Giả sử một người leo núi với số đồ dùng được cấp đủ mất N ngày để lên đến đỉnh núi.
Đỉnh núi có thể quá cao khiến người leo núi không thể mang theo tất cả đồ dùng lên đến
đỉnh. Do đó, một nhóm người leo núi cùng xuất phát ở một chỗ tại cùng một thời điểm.
Một người leo núi xuống sức trước khi lên đến đỉnh sẽ chuyển toàn bộ số đồ dùng mang
theo cho người khác. Nhóm leo núi không nghỉ trong suốt chuyến đi.
Bài toán yêu cầu lập kế hoạch giúp câu lạc bộ leo núi. Ít nhất một người leo núi phải lên
đến dỉnh núi và tất cả những người còn lại sẽ trở lại điểm khởi hành.
Yêu cầu
Hãy viết chương tình thực hiện các nhiệm vụ sau:
1. Nhập từ bàn phím số nguyên N chỉ số ngày cần thiết để lên đến đỉnh núi, số người leo
núi P của câu lạc bộ, số đồ dùng được cấp S(i) và số đồ dùng cần thiết C(i) của người thứ
i (i nằm từ 1 đến P). Giả sử dữ liệu vào đều là số nguyên.
2. Lập kế hoạch cho câu lạc bộ leo núi. Xác định các nhóm leo núi a(1), , a(k) và số đồ
dùng được cấp M(j) mà người leo núi (j) mang theo lúc khởi hành (j nằm từ 1 đến k).
Chú ý, có thể không tồn tại một kế hoạch cho cho sự kết hợp N, S(i) và C(i).
3. Báo cáo các thông tin sau ra màn hình:
a) số người leo núi thực tế k tham gia leo núi,
b) tổng số đồ dùng cần được cấp,
c) số người leo núi a(1), , a(k),
d) với mọi a(j), j nằm giữa 1 và k, tổng số đồ dùng được cấp M(j) được người a(j) mang
theo.
e) ngày D(j) khi số người leo núi a(j) xuống sức.
4. Kế hoạch là tối ưu nếu
a) số người tham leo núi là tối thiểu và
b) trong số tất cả các nhóm thỏa mãn điều kiện a), tổng số đồ dùng dùng hết là ít nhất.
Hãy cố tìm kế hoạch gần tối ưu.
Yêu cầu kỹ thuật
Yêu cầu 1: Lưu chương trình lập kế hoạch vào tệp văn bản ASCII với tên gọi

"C:\IOI\DAY-2\422-PROG.xxx". Phần mở rộng .xxx là:
- .BAS với chương trình BASIC, .C với chương trình C,
- .LCN với chương trình LOGO, .PAS với chương trình PASCAL
Yêu cầu 2: Chương trình loại bỏ dữ liệu vào với N nhỏ hơn 1 hoặc lớn hơn 100.
P phải lớn hơn 1 và nhỏ hơn 20.
Ví dụ
Có thể so sánh với chương trình của bạn:
Số ngày cần để lên đến đỉnh: 4
Số thành viên câu lạc bộ: 5
Số đồ dùng tối đa cấp cho người leo núi 1 : 7
Mức tiêu thụ hàng ngày của người leo núi 1 : 1
Số đồ dùng tối đa cấp cho người leo núi 2 : 8
Mức tiêu thụ hàng ngày của người leo núi 2 : 2
Số đồ dùng tối đa cấp cho người leo núi 3 : 12
Mức tiêu thụ hàng ngày của người leo núi 3 : 2
Số đồ dùng tối đa cấp cho người leo núi 4 : 15
Mức tiêu thụ hàng ngày của người leo núi 4 : 3
Số đồ dùng tối đa cấp cho người leo núi 5 : 7
Mức tiêu thụ hàng ngày của người leo núi 5 : 1

Cần 2 người leo núi, tổng số đồ dùng cần cung cấp là 10.
Người leo núi 1 và 5 sẽ leo tiếp.
Người leo núi 1 mang theo 7 đơn vị đồ dùng mất xuống sau 4 ngày
Người leo núi 5 mang theo 3 đơn vị đồ dùng mất xuống sau 1 ngày

Có lập kế hoạch tiếp không (Y/N) Y

Số ngày cần lên đến đỉnh: 2
Số thành viên trong câu lạc bộ: 1
Số đồ dùng tối đa cấp cho người leo núi 1: 3

Mức tiêu thụ hàng ngày của người leo núi 1: 1
Không có ai leo núi
Có lập kế hoạch tiếp không (Y/N) Y
Good bye
3. Quay Rubik
Hình lập phương Rubik gồm 3 x 3 x 3 hình lập phương nhỏ hơn. Ban đầu, mỗi trong số 6
mặt của hình lập phương Rubik được sơn một màu khác nhau. Tất cả các mặt của hình
lập phương Rubik gồm 3 x 3 mặt của lớp 9 hình lập phương nhỏ hơn.
Hãy tưởng tượng, bạn đang nhìn vào một trong 6 mặt của hình lập phương Rubik. Lớp
gồm 3 x 3 hình lập phương nhỏ hơn bạn nhìn thấy có thể quay một góc là bội số của 90
độ, trong đó trục quay là đường trực giao của mặt đó và đi qua tâm của nó. Kết quả là
một mặt khác gồm 3 x 3 x 3 hình lập phương nhỏ với sơ đồ màu bị quay và màu trên bốn
mặt xung quanh thay đổi.
Trong bài toán này, các mặt hình lập phương được đặt tên thay vì sơn màu: U = Lên, R =
Phải, F = Trước, B = Sau, L = Trái và D = Dưới. Bất kỳ một chuỗi hành động quay mặt
lập phương nào đều có thể biểu diễn bằng một chuỗi ký tự {U, R, F, B, L, D} trong đó
mỗi ký tự thay thế một lần quay góc 90 độ theo chiều kim đồng hồ của một mặt tương
ứng.
Yêu cầu
Hãy viết chương trình cho phép người sử dụng giải lặp lại một trong ba bài toán nhỏ đưa
ra theo thứ tự bất k ỳ. Bạn có thể giả sử độ dài của mỗi chuỗi nhập vào không quá 35 ký
tự.
1. Bài toán nhỏ này là bản dịch từ của một chuỗi hành động quay cho trước sang một
chuỗi hành động quay mà không một hành động quay nào được lặp lại quá 3 lần trong
chuỗi. Thuật toán phải loại bỏ những chuỗi dữ liệu vào không đúng.
Ví dụ minh họa:

×