Trò chơi He

Một phần của tài liệu Tổng hợp các đề Olympic tin học quốc tế từ năm 1989 đến 2006 (Trang 74 - 77)

- .LCN với chương trình LOGO, PAS với chương trình PASCAL

Trò chơi He

(CHÚ Ý: Bạn cần download chương trình thử nghiệm về để giải bài tốn này).

Mục đích của trị chơi là để người chơi thứ nhất nối dụng cụ đếm hình lục giác từ cột 1 đến cột N.

Quy tắc chơi: Hex là một trò chơi giành cho hai người chơi trên một bảng hình thoi kích

thước N x N gồm nhiều hình lục giác nhỏ như trong hình dưới với N = 6.

1. Hai người tham gia trị chơi là chương trình của bạn và một chương trình đánh giá. 2. Chương trình của bạn luôn được đi nước đầu tiên.

3. Hai người lần lượt thay phiên nhau đi trên bảng.

4. Một thiết bị đếm được đặt ở một vị trí nào đó trên bảng. 5. Hai hình lục giác tiếp xúc nhau nếu chúng có chung 1 cạnh.

6. Các thiết bị đếm trên hai hình lục giá lân cận của cùng một người chơi được nối với nhaụ

7. Các liên kết có tính bắc cầu: nếu hex1 nối với hex2 và hex2 nối với hex3 thì hex3 nối với hex1 và ngược lạị

Bài toán:

 Bạn phải viết một chương trình chơi trị chơi nàỵ

 Mục tiêu của người chơi thứ nhất (chương trình của bạn) là nối một thiết bị đếm của bạn trên cột 1 với một thiết bị đếm của bạn trên cột N.

 Chương trình đánh giá (người chơi cịn lại) cố gắng nối một thiết bị đếm của nó trên hàng 1 với một thiết bị đếm của nó trên hàng N.

 Nếu chương trình của bạn là tối ưu, nó sẽ ln thắng.

Input và Output:

Chương trình của bạn phải nhận dữ liệu trực tiếp từ bàn phím nhập vào và cũng khơng báo kết quả ra màn hình. Nó nhận dữ liệu vào các hàm của chương trình đánh giá. Chương trình đánh giá sẽ tạo ra một file output mang tên HEX.OUT; bạn không cần quan tâm đến nội dung của file đó.

Khi bắt đầu trị chơi, chương trình của bạn được hiển thị một bảng với các thiết bị đếm đặt sẵn biểu diễn một trạng thái trò chơi mà người chơi thứ nhất có thể thắng. Chương trình của bạn phải dùng các hàm GetMax và LookAtBoard để xác định trạng thái bảng. Bắt đầu trị chơi, chương trình của bạn và chương trình đánh giá đưa ra các lời chào lẫn nhaụ

Ràng buộc:

Kích thước bảng nằm từ 1 đến 20. Chương trình của bạn được thực hiện tối đa 200 di chuyển để hồn thành trị chơị Tồn bộ trị chơi phải kết thúc trong vịng 40 giâỵ Chắn chắn, chương trình đánh giá sẽ hồn thành trị chơi trong vịng 20 giâỵ

Chương trình đánh giá:

Thư viện HexLib sẽ cung cấp cho bạn một số module mã hóa bạn có thể đưa vào lập trình. Một tệp mẫu tương ứng với mỗi ngơn ngữ lập trình được gắn kèm trong thứ mục đề bàị Các tệp đó là TESTHEX.CPP, TESTHEX.C, TESTHEX.PAS, và TESTHEX.BAS. Nếu dùng QuickBasic, bạn phải gõ lệnh QB/L HEXLIB để gọi thư viện. Các hàm của HexLib là: (theo thứ tự Pascal, CIC+-t và Basic) hàm LookAtBoard (row, column: integer): số nguyên; int LookAtBoard (int row, int column); LookAtBoard (byval x as integer, byvaly as integer) trả lại giá trị

-1 nếu row<l hoặc row>N hoặc column<l hoặc column>N,

0 nếu khơng có thiết bị đếm nào ở vị trí đó nếu thiết bị đếm ở vị trí xác định tuỳ thuộc vào trò chơi của bạn,

2 nếu thiết bị đếm ở vị trí xác định tuỳ thuộc vào chương trình đánh giá.

procedure PutHex (row, column: integer); void PutHex (int row, int column);

declare sub PutHex cdecl (byval x as integer, byval y as integer)

Đặt một thiết bị đếm của đối thủ vào hàng và cột xác định nếu vị trí đó cịn trống.

function GamelsOver: integer; int CamelsOver (void);

declare function GamelsOver cdecl ()

Trả lại một trong các số nguyên sau: 0 trò chơi chưa kết thúc

1 bất kỳ vị trí nào trên bảng có thiết bị đếm 2 chương trình của bạn thắng

3 chương trình thử nghiệm thắng.

procedure MakeLibMove; void MakeLibMove(void);

Cho phép thư viện đánh giá tính bước đi tiếp theo và đặt thiết bị đếm của nó vào bảng. Sự thay đổi trên bảng được chỉ ra bằng hàm LookAtBoard và các hàm khác.

function GetRow: integer; int GetRow (void);

declare function GetRow cdecl ()

Trả lại hàng của thiết bị đếm cuối cùng do thư viện đánh giá đặt vào, hoặc -1 nếu vẫn chưa thiết bị đếm nào được đặt vào bảng. Hàm này thường trả lại cùng giá trị đến khi chương trình của bạn gọi lại hàm MakeLibMovẹ

function CetColumn: integer; int GetColumn (void);

declare function GetColumn cdecl ()

Trả lại cột của thiết bị đếm cuối cùng do thư viện đánh giá đặt vào bảng hoặc -1 nếu vẫn chưa có thiết bị đếm nào được đặt vàọ Hàm này thường trả lại cùng giá trị đến khi chương trình của bạn gọi lại hàm MakeLibMovẹ

function GetMax: integer; int GetMax (void);

declare function GetMax cdecl ()

Trả lại kích thước bảng là N.

Đánh giá:

Nếu chương trình của bạn thắng, nó sẽ giành được điểm tối đa cho bộ dữ liệu vào đó. Nếu chương trình của bạn thua, nó sẽ giành được 20% tổng số điểm cho bộ dữ liệu đó. Nếu chương trình của bạn thốt ra trước khi trị chơi kết thúc hoặc hết thời gian chơi, nó sẽ khơng giành được điểm nàọ

Một phần của tài liệu Tổng hợp các đề Olympic tin học quốc tế từ năm 1989 đến 2006 (Trang 74 - 77)