2-2001
Ioiwari Game
Bài toán
Mancala là trò chơi với các viên bi và các hố đã được con người chơi từ rất lâu. Bài toán này giới
thiệu một dạng của trò chơi. Trò chơi giành cho hai người trên một bảng hình tròn có bảy hố trên
viền bảng và mỗi người có một bờ. Khi trò chơi bắt đầu bằng việc phân phối ngẫu nhiên 20 viên
bi vào các hố sao cho mỗi hố chứa ít nhất 2 viên và nhiều nhất 4 viên bi. Hai người chơi lần lượt
chơi. Một người chơi chọn một hố có các viên bi và lấy tất cả bi ra khỏi hố và cầm trên tay. Khi có
bi trên tay mình, người chơi xét các hố theo chiều kim đồng hồ, bắt đầu từ hố ngay sau hố trống
và thực hiện công việc sau:
•
Có hơn một viên bi trên tay bạn: Nếu hố hiện tại đã chứa 5 viên bi thì hãy lấy 1 viên ra khỏi
hố đó và đặt lên bờ của bạn, nếu không hãy đặt một viên bị trên tay bạn xuống hố đó.
•
Trên tay bạn chỉ có một viên bi: Nếu hố hiện tại chứa ít nhất 1 và nhiều nhất 4 viên bi thì hãy
lấy tất cả các viên bi từ hố đó và 1 viên trên tay bạn rồi đặt lên bờ, nếu không (hố đó chứa 0
hoặc 5 viên bi) hãy đặt viên bi trên tay bạn vào bờ của người chơi thứ hai.
•
Nếu đến lúc chương trình của bạn chơi, thì chương trình hãy viết số thứ tự hố được chơi vào
output
•
Nếu đến lúc đối thủ chơi, thì chương trình của bạn đọc số thứ tự hố được chơi từ input. Công cụ
Cho trước một chương trình (
ioiwari2
trên Linux,
ioiwari2.exe
trên Windows), với vai trò
người chơi thứ hai. Đầu tiên, nó sẽ viết vào output dòng đầu tiên mà chương trình của bạn sẽ đọc
mô tả số viên bi ban đầu trong các hố của trò chơi:
4 3 2 4 2 3 2
nước đi từ
C
. Bắt đầu trò chơi
C
ở vị trí 1. Một nước đi gồm các thao tác sau:
1.
Nếu giá trị của
C
lớn hơn số điểm hiện tại của người sở hữu
C
, thì giá trị của
C
trở thành số
điểm mới của người sử hữu
C
. Ngược lại, số điểm của người sở hữu
C
không đổi. Số điểm
của người chơi còn lại không thay đổi trong trường hợp này.
2.
Sau đó, người sở hữu
C
chọn một trong số các mũi tên ngoài vị trí của mã thông báo hiện tại
và đích của mũi tên trở thành vị trí mới của mã thông báo hiện tại. Một người chơi có thể thực
Hãy viết chương trình chơi trò chơi và chiến thắng. Tất cả các trò chơi được dùng để đánh giá đều
có thể thắng tuỳ vào việc bạn thực hiện nước đi trước hay sau. Đối thủ của bạn luôn chơi một cách
tối ưu nghĩa là kho có cơ hội anh ta sẽ chiến thắng và chương trình của bạn thua. Input và Output
Chương trình của bạn là ngời chơi thứ nhất và đối thủ là người chơi thứ hai. Khi chương trình của
bạn bắt đầu chạy, nó sẽ đọc dữ liệu vào từ input gồm: dòng thứ nhất chứa 1 số nguyên chỉ số vị trí
N
, 1<=
N
<=1000.
N
dòng tiếp theo mỗi dòng chứa
N
số nguyên chứa thông tin về các mũi tên.
Nếu có một mũi tên chỉ từ vị trí
i
đến vị trí
j
, thì số thứ
j
.
j
luôn thoả mãn 1<=
j
<=
N
và tất cả các giá trị đều khác nhau.
Page 1
Median StrengthSau đó, trò chơi bắt đầu với vị trí mã thông báo hiện tại là 1. Chương trình chơi như sau và sẽ
thoát ra khi mã thông báo trở lại ví trí 1:
•
Nếu đến lượt chương trình của bạn thực hiện nước đi, thì nó sẽ viết số vị trí tiếp theo
P
, 1<=
P
<=
N
, vào output
•
Nếu đến lượt đối thủ của chương trình của bạn thực hiện nước đi, thì chương trình đọc số vị trí
Nếu bạn lập trình bằng C++ và dùng iostreams, hãy dùng lệnh sau để đọc input và viết vào
output:
cin>>target;
cout<<target<<endl<<flush;
N
ế
b
l
ậ
t
ì
h
b
ằ
C
h
ặ
C++
à
d
ù
f
à
ằ
ng
C
h
o
ặ
c
C++
v
à
d
ù
ng scan
f
v
à
pr
i
n
tf
,
h
ã
y
d
ù
ng
l
ệ
Writeln(target); Công cụ
Cho trước một chương trình (
score2
trên Linux,
score2.exe
trên Windows). Chương trình đọc
mô tả trò chơi từ tệp
score.in
theo định dạng như trang trên. Chương trình sẽ viết thông tin này
vào output theo đúng định dạng đó. Output có thể được dùng làm input cho chương trình của bạn
với mục đích thử nghiệm. Sau đó, chương trình chơi theo cách ngẫu nhiên đọc các nước đi từ
input và viết nước đi của nó vào output.
Page 3
3-2001
Twofive
từ tuỳ ý và tìm từ tương ứng với số thứ tự cho trước. Cuốn từ điển chứa tối đa không quá 2
31
từ.
Input Input là một tệp có tên
twofive.in
và gồm hai dòng. Dòng đầu tiên chứa một chuỗi chỉ gồm
một ký tự 'W' hoặc 'N'. Nếu dòng đầu tiên chứa ký tự 'W' thì dòng thứ hai sẽ chứa một từ chuẩn
theo ngôn ngữ 25 là một chuỗi gồm 25 ký tự. Nếu dòng thứ nhất chứa ký tự 'N' thì dòng thứ hai
sẽ chứa một số thứ tự của một từ chuẩn theo ngôn ngữ 25.
Output Output là một tệp có tên
twofive.out
và chỉ chứa một dòng. Nếu dòng thứ hai của input
chứa một từ chuẩn theo ngôn ngữ 25 thì dòng này sẽ chứa số thứ tự của từ đó. Nếu dòng thứ hai
của input chứa số thứ tự của một từ chuẩn theo ngôn ngữ 25 thì dòng này sẽ chứa từ tương ứng
với số thứ tự đó.
cout<<mymove<<endl<<flush;
cin>>last;
Nếu bạn lập trình bằng C hoặc C++ và dùng scanf và printf, hãy dùng lệnh sau để đọc input và
viết vào output:
printf("%d\n",mymove); fflush (stdout);
scanf ("%d", &last);
Nếu lập trình bằng Pascal, hãy dùng lệnh sau để đọc input và viết vào output:
Writeln(mymove);
Readln(last);
Ví dụ