Trong đó bao gồm thông tin về màu sắc của những quả trứng phục sinh, cùng với những sự kiện xảy ra trong lúc chuẩn bị trứng.. Mỗi hàng trứng là một danh sách màu sắc các quả trứng nằm tr
Trang 1Bài Tập Lớn 1
EASTER BUNNY
1 Giới thiệu
Ngày xửa ngày xưa, từ trước khi Prometheus đem ngọn lửa thắp sáng cho nhân
loại, ông kẹ Pitch Black là nỗi ám ảnh gieo rắc sợ hãi cho loài người mỗi đêm
Để giúp cho nhân loại vượt trên nỗi sợ hãi để tìm đến hy vọng, tình yêu và
hạnh phúc, Man on the Moon đã tập hợp những vệ thần để gieo rắc hạt giống
niềm tin vào tâm hồn mỗi người khi họ còn là những đứa trẻ Năm vệ thần
được chọn gồm có Tooth Fairy, Santa Claus, Easter Bunny, Sandman và nay là
Jack Frost Từ đó, Pitch Black đã bị đẩy lùi vào bóng tối dưới gầm giường
Nhưng nỗi sợ hãi của những đứa trẻ vào mỗi đêm chưa đủ để thỏa mãn tham
vọng của Pitch Black Hắn âm thầm thực hiện âm mưu cướp đi niềm tin vào
phép màu, vào hạnh phúc của trẻ thơ Từ đó, một lần nữa nhấn chìm thế giới
vào bóng đêm của sự sợ hãi
Pitch Black và thuộc hạ Nightmare của hắn đã tấn công vào nơi ở của nàng
tiên răng Tooth Fairy và cướp hết những chiếc răng sữa của trẻ em cùng với ký
ức về niềm vui và hạnh phúc chứa trong đó Trong lúc các vệ thần chiến đấu
cùng Pitch Black, thì tại vương quốc Bunnymund, các chú thỏ cũng đang gấp
rút tô màu cho những quả trứng phục sinh Để tiện cho việc tô màu, những quả
trứng phục sinh được xếp thành 03 hàng Những chú thỏ sẽ tô màu cho những
quả trứng, đồng thời Pitch Black cũng không ngừng gửi những thuộc hạ đến
phá hoại Nếu đến cuối cùng, màu của những quả trứng phục sinh trùng khớp
với lời tiên tri trong bài hát của ảo thuật gia Méliès thì các vệ thần sẽ giành
chiến thắng
Trang 22 Yêu cầu
Trong bài tập lớn này, sinh viên sẽ được cung cấp một file chứa dữ liệu nhập
Trong đó bao gồm thông tin về màu sắc của những quả trứng phục sinh, cùng
với những sự kiện xảy ra trong lúc chuẩn bị trứng Chương trình sẽ xuất ra màn
hình thông tin màu sắc của những quả trứng sau khi quá trình chuẩn bị kết
thúc Các dữ liệu nhập xuất mà sinh viên phải xử lý đểu được biểu diễn dưới
dạng danh sách liên kết (linked list) Chi tiết mô tả dữ liệu nhập và các công
việc sinh viên phải làm được nêu trong phần dưới đây
3 Dữ liệu nhập
Dữ liệu nhập của chương trình được chứa trong file mang tên input.txt File
này sẽ chứa các thông tin như sau:
100_100_100 200_200_000 001_003_012 ;
130_100_150 200_200_010 ;
100_110_100 100_200_030 ;
0_100_001_010_1 ;
Trong đó, các thành phần dữ liệu nhập được ngăn cách bằng dấu chấm
phẩy với thứ tự lần lượt như sau:
03 thành phần đầu tương ứng với khởi tạo 03 hàng trứng ban đầu Mỗi
hàng trứng là một danh sách màu sắc các quả trứng nằm trong hàng đó
Màu sắc quả trứng được mô tả dưới dạng R_G_B với R, G, B gồm 3 ký
số có giá trị từ 000-999 Giữa các quả trứng được ngăn cách bởi khoảng trắng Mỗi hàng chứa tối đa 2100 quả trứng
Thông tin về 3 hàng trứng ban đầu
Thông tin về các sự kiện xảy ra
Trang 3 Thành phần cuối cùng là danh sách sự kiện xảy ra theo thứ tự thời gian
Các sự kiện cách nhau bằng khoảng trắng và được mô tả theo bảng mã
sự kiện như sau (các mã sự kiện không đúng theo mô tả sẽ bị bỏ qua)
0_R_G_B_T Một quả trứng được E.B tô màu xong và thêm vào cuối hàng
1_R_G_B_P_T Jack Frost đổi màu của một quả trứng
2_R_G_B Nightmare tấn công làm phai màu trứng
3_R_G_B Ông kẹ Pitch Black lẻn vào lấy cắp một quả trứng
4_R_G_B_M Lấy những quả trứng kì diệu để phục sinh cho Sandman
5_R_G_B_P Nhóc tiên Tooth Baby làm xáo trộn màu trứng
6_R_G_B Sophie giấu chú thỏ vào bên phải quả trứng gần giống nhất
7_S Toothiana đưa những quả trứng về trạng thái quá khứ
8_K Các chú thỏ đào hang cất giấu trứng khỏi The Monkey King
9_C Bí mật của Santa Claus
Ban đầu hàng trứng trên cùng có 03 quả trứng, hàng trứng thứ hai có 02 quả
trứng và hàng trứng cuối cùng có 01 quả trứng Trong quá trình chuẩn bị trứng
thì có một sự kiện xảy ra Đó là sự kiện, một quả trứng có màu đỏ:100, xanh
lá:001, xanh dương:010 được thêm vào hàng trứng trên cùng
Trang 44 Hiện thực chương trình
Sinh viên sẽ hiện thực một hàm prepare có prototype như sau:
void prepare (EEList*& top, EEList*& middle, EEList*& bottom, eventList* pEvent);
Trong đó:
a) EEList là một danh sách liên kết chứa các thông tin về màu của các quả
trứng, được khai báo như sau:
Danh sách này gồm có thông tin về mã màu của mỗi quả trứng gồm có
nCodeR (mã màu đỏ), nCodeG (mã màu xanh lá), nCodeB (mã màu xanh
dương) Danh sách khi truyền vào ban đầu là danh sách tất cả những quả trứng
được nhập vào từ file input chưa được xử lý Trong quá trình hiện thực sinh
viên sẽ thay đổi danh sách này theo thông tin mô tả ở Phần 5
Có ba con trỏ trỏ đến ba danh sách liên kết EEList được truyền vào tương ứng
với ba hàng trứng ở trên, ở giữa và ở dưới
b) eventList là một danh sách liên kết chứa thông tin về các sự kiện, được
khai báo như sau:
Danh sách này gồm có mã sự kiện và một con trỏ trỏ đến danh sách các thông
số tương ứng với từng mã sự kiện khác nhau (xem Phần 3)
Trang 55 Hiện thực danh sách trứng phục sinh (Easter Eggs – EE)
Khởi tạo 03 danh sách EE tương ứng với 03 hàng trứng từ file dữ liệu nhập như đã
mô tả ở Phần 3 Những quả trứng có màu hợp lệ có giá trị mã màu R_G_B với R,
G, B nằm trong khoảng 000-255 mới được đưa vào danh sách EE
Hàng trứng trên cùng có một quả trứng có mã màu RGB tương ứng
{100,100,100} Hàng trứng ở giữa có một quả trứng có mã màu RGB {130,
100,150} Hàng trứng dưới cùng có chỉ hai quả trứng mang mã màu hợp lệ
{100, 010,001} và {201,202,203}
Trong bất kì trường hợp nào, những quả trứng trong mỗi hàng đều được
chú thỏ E.B sắp xếp lại và dồn về bên trái Điều đó là vị trí của mỗi quả trứng
đều có thứ tự được đánh từ trái sang phải và có chỉ số bắt đầu là 1 Xét ví dụ 2,
quả trứng {100,100,100} nằm ở hàng trên cùng và có thứ tự là 1; ở hàng dưới
cùng, quả trứng {100,010,001} mang thứ tự 1 và quả trứng {201,202,203} mang
thứ tự 2
Trong suốt quá trình chuẩn bị trứng cho ngày lễ sẽ có những sự kiện xảy ra làm
thay đổi những danh sách này Các sự kiện cụ thể như sau:
S0) Các chú thỏ hoàn tất tô màu cho một quả trứng và thêm quả trứng đó vào cuối
một trong 03 hàng trứng ban đầu Mã sự kiện có dạng 0_R_G_B_T Trong đó
R,G,B gồm 3 ký số có giá trị từ 000-999 cho biết màu của quả trứng cần thêm T
là số nguyên cho biết hàng trứng được thêm vào Các giá trị của T thuộc {1,2,3}
Trang 6tương ứng với {hàng trên cùng, hàng ở giữa, hàng dưới cùng} Quả trứng mới với
màu hợp lệ được thêm vào cuối hàng trứng
Ứng với mã sự kiện 0_123_234_012_3, một quả trứng có mã màu
{123,234,012} được thêm vào cuối của hàng trứng dưới cùng như sau:
Ứng với mã sự kiện 0_999_234_012_3, màu của quả trứng mới không phải là
giá trị hợp lệ, quả trứng không được thêm vào hàng
S1) Jack Frost là một vệ thần rất nghịch ngợm Để trêu chọc Easter Bunny, Jack
Frost cố tình đổi màu của một quả trứng bất kì Mã sự kiện có dạng
1_R_G_B_P_T Trong đó, P là số nguyên dương chỉ vị trí của quả trứng bị đổi
màu trong hàng T Màu mới của quả trứng được xác định bởi R,G,B Các giá trị
R,G,B, T được định nghĩa giống như ở mục S0 Nếu vị trí P không tồn tại trong
hàng T, Jack Frost sẽ không đổi màu trứng và danh sách trứng được giữ nguyên
Trang 7Lưu ý: Jack Frost là một vệ thần bất quy tắc, do đó màu sắc mới của quả trứng
bị thay đổi không cần là màu sắc hợp lệ mà có thể là giá trị bất kì trong khoảng
S2) Để ngăn cản không cho các chú thỏ hoàn thành vẽ trứng trước lễ Phục Sinh,
ông kẹ Pitch Black cử bọn Nightmare tấn công vương quốc Bunnymund Mỗi đợt
tấn công, bọn Nightmare sẽ làm tất cả số trứng bị phai màu Mã sự kiện có dạng
2_R_G_B Màu của mỗi quả trứng sẽ bị giảm một lượng R,G,B tương ứng với ba
chỉ số R,G,B ban đầu Màu của quả trứng chỉ có thể bị giảm về 000
Ví dụ 7: Với dữ liệu nhập là
100_100_100 ;
130_100_150 ;
Trang 8S3) Biết được lời tiên tri của Méliès về sự chiến thắng của các vệ thần, ông kẹ
Pitch Black lẻn vào vương quốc Bunnymund để lấy cắp trứng nhằm ngăn lời tiên
tri trở thành sự thật Mã sự kiện có dạng 3_R_G_B, với R,G,B là những số nguyên
định nghĩa như mục S0 Do Pitch Black không biết hết lời tiên tri chỉ biết được
màu gần đúng của một quả trứng xác định bằng giá trị R,G,B ở trên, hắn sẽ lựa
chọn quả trứng có màu gần giống nhất và lấy nó đi khỏi hàng trứng Mức độ
giống nhau giữa hai quả trứng được tính bằng khoảng cách Mahatan như sau:
mdiff({R1,G1,B1},{R2,G2,B2}) = |R1-R2| +|G1-G2| + |B1-B2|
Hai quả trứng có màu càng gần giống nhau nếu khoảng cách trên giữa chúng
càng nhỏ Nếu có nhiều quả trứng gần giống với lời tiên tri, để tiết kiệm thời gian,
Pitch Black sẽ lấy cắp quả trứng gần nhất theo thứ tự ưu tiên hàng trứng (từ trên
xuống) và vị trí từ trái sang phải trong mỗi hàng
Ví dụ 8: Với dữ liệu nhập là
100_100_100 ;
Trang 9Pitch Black tìm được hai quả trứng {100,100,100} và {100,110,100} với cùng
mdiff = 5 nhỏ nhất, lúc này hắn lựa chọn quả trứng gần nhất theo thứ tự ưu tiên
là {100,100,100} và lấy nó khỏi hàng trứng
;
130_100_150 ;
100_110_100 ;
S4) Trong lúc đánh nhau với Pitch Black, thần ngủ Sandman mắc bẫy và bị giết
chết Vô cùng đau buồn trước cái chết của Sandman, Jack Frost cùng những chú
thỏ tập hợp những quả trứng phục sinh để cứu Sandman sống lại Mã sự kiện có
dạng 4_R_G_B_M Trong đó, màu của quả trứng kì diệu trong truyền thuyết được
xác định bởi R,G,B là những số nguyên định nghĩa như mục S0 Chỉ những quả
trứng gần giống với quả trứng kì diệu với giá trị mdiff nhỏ hơn ngưỡng quy định
M mới có thể giúp Sandman sống lại Những quả trứng này sẽ được lấy ra khỏi
hàng trứng và giúp hổi sinh Sandman
Trang 10Hai quả trứng {100,100,100} và {100,110,100} với cùng mdiff = 5 < 10 sẽ được
lấy ra khỏi hàng trứng để hổi sinh Sandman
;
130_100_150 ;
;
S5) Nhóc tiên Tooth Baby muốn giúp các chú thỏ vẽ trứng phục sinh Nhưng với
bản tính hậu đậu, Tooth Baby lại làm xáo trộn màu sắc của các quả trứng Thay vì
tô màu cho trứng, nhóc tiên sẽ hoán đổi màu của quả trứng với màu hiện có
Mã sự kiện có dạng 5_R_G_B_P cho biết màu sắc và vị trí ban đầu trong hàng
trứng mà Tooth Baby định tô màu Tooth Baby sẽ làm xáo trộn màu sắc trứng theo
quy luật dưới đây:
Tooth Baby sẽ bắt đầu hoán đổi màu ban đầu với màu của quả trứng ở vị trí
P trong hàng tương ứng nếu vị trí đó có tồn tại trong hàng, nếu không nhóc
tiên sẽ chuyển xuống hàng kế tiếp Thứ tự ưu tiên là từ hàng trên cùng
xuống hàng giữa và hàng dưới cùng Nếu vị trí P không tồn tại trong cả ba
hàng, Tooth Baby sẽ không tô màu và danh sách EE giữ nguyên
Sau đó, Tooth Baby sẽ tiếp tục bay đến cho những quả trứng xung quanh và
hoán đổi màu hiện có với màu quả trứng ở vị trí mới Vốn dĩ thích màu
xanh nên nhóc tiên sẽ lựa chọn trong những quả trứng ở vị trí lân cận theo
thứ tự dưới, trên, trái, phải vị trí có thành phần G lớn hơn màu hiện có Quá
trình hoán đổi màu sẽ tiếp tục cho đến khi vị trí như vậy không tồn tại
Trang 11Tooth Baby sẽ đậu vào quả trứng {100,100,106} ở vị trí thứ 4 của hàng giữa và
hoán đổi màu sắc ban đầu với màu của quả trứng này
100_100_100 100_100_102 100_100_100 ;
130_100_150 100_100_100 100_150_100 100_100_200 ;
100_110_100 130_100_150 100_100_100 100_100_100;
Tiếp theo, nhóc tiên sẽ lần lượt xem xét quả trứng ở vị trí dưới {100,100,100},
trái {100,150,100} và chọn vị trí đầu tiên theo thứ tự đó có giá trị G lớn hơn
màu hiện có, ở đây là vị trí trái {100,150,100} và hoán đổi với màu hiện có
{100,100,106}
100_100_100 100_100_102 100_100_100 ;
130_100_150 100_100_100 100_100_106 100_100_200 ;
100_110_100 130_100_150 100_100_100 100_100_100;
Lúc này các vị trí dưới {100,100,100}, trên {100,100,100}, trái {100,100,100}
và phải {100,100,200} đều có giá trị G nhỏ hơn màu hiện có {100,150,100} nên
nhóc tiên Tooth Baby dừng quá trình xáo trộn màu trứng
S6) Khi Pitch Black tập kích vào vương quốc Bunnymund, cô bé Sophie hóa trang
các chú thỏ thành những quả trứng phục sinh và giấu vào hàng trứng Mã sự kiện
có dạng 6_R_G_B Trong đó, ba ký số R,G,B được định nghĩa như mục S0 cho
biết màu của quả trứng mà Sophie hóa trang cho chú thỏ Để không bị phát hiện,
cô bé sẽ giấu chú thỏ vào bên phải quả trứng có màu gần giống nhất (được mô tả
Trang 12trong mục S3) Nếu cả ba hàng trứng đều rỗng, Sophie sẽ đặt chú thỏ vào hàng
Sophie hóa trang chú thỏ thành quả trứng có màu {100,100,105} và giấu vào vị
trí bên phải của quả trứng {100,100,104} với mdiff = 1 và độ ưu tiên cao hơn
S7) Nàng tiên răng Toothiana thường có những linh cảm về quá khứ nhưng không
phải lúc nào cũng chính xác Những lúc như vậy, nàng sẽ đưa trạng thái của những
quả trứng về trước đó một khoảng thời gian Mã sự kiện có dạng 7_S cho biết
trạng thái của những quả trứng sẽ bị lùi S sự kiện Do phép thuật của Toothiana có
giới hạn nên nàng chỉ có thể thay đổi một nửa số trứng mỗi hàng (làm tròn lên nếu
số trứng là số lẻ) Hàng trứng mới được tạo thành bằng cách ghép nửa sau của
danh sách EE trong quá khứ vào cuối nửa đầu của danh sách EE hiện tại Ngoài ra,
số sự kiện S chỉ giới hạn là 1 hoặc 2 Nếu số sự kiện đã xảy ra nhỏ hơn S, hàng
trứng sẽ được đưa về trạng thái ban đầu
Ví dụ 13: Với dữ liệu nhập là
100_100_100 100_100_102 100_100_100 ;
130_100_150 100_100_100 100_100_104 100_100_106 ;
Trang 13S8) Nhận thấy các chú thỏ sắp hoàn tất tô màu trứng phục sinh, Pitch Black sai
The Monkey King phá hoại số trứng Thỏ E.B chỉ đạo thần dân vương quốc đào
hang và đưa trứng xuống giấu Sau khi The Monkey King bị đánh bại, số trứng lại
được đưa lên và xếp trở lại vào hàng Mã sự kiện có dạng 8_K trong đó K cho biết
cách thức các chú thỏ đào hang, bao gồm các giá trị
K=1 hang được đào chỉ có một cửa
K=2 hang được đào có 2 cửa vào/ra, nhưng cửa vào bị The Monkey King
chặn lại khi rút lui
Trang 14 K=3 hang được đào có 2 cửa vào/ra
Những quả trứng sẽ được đưa xuống hang theo thứ tự hàng từ trên xuống và từ
trái sang phải trong hàng Tùy thuộc vào cách thức đào hang mà trứng sẽ được lấy
ra để xếp lại vào hàng, cụ thể như sau
K=1 hang chỉ có một cửa nên quả trứng đưa vào sau sẽ được lấy ra trước
K=2 cửa vào bị chặn nên chỉ có thể lấy trứng từ cửa ra, quả trứng đưa vào
trước sẽ được lấy ra trước
K=3 trứng được lấy đồng thời từ hai phía cửa hang, trứng được lấy từ lần
lượt từ cửa vào rồi đến cửa ra
Sau đó, trứng sẽ được chia đều vào ba hàng sao cho số trứng ở hàng trên luôn nhỏ
hơn hoặc bằng hàng dưới
Trứng được lấy ra theo thứ tự {100,100,100}, {100,100,102}, {130, 100, 150},
{100,100,100}, {100,110,100} và giấu vào hang
100_100_100
Sau khi The Monkey King rút lui, ứng với K = 1, trứng sẽ được lấy ra theo thứ
tự và xếp lại vào hàng, danh sách EE trở thành
100_110_100 ;
100_100_100 130_100_150 ;
100_100_102 100_100_100 ;
Trang 15Trứng được lấy ra theo thứ tự {100,100,100}, {100,100,102}, {130, 100, 150},
{100,100,100}, {100,110,100} và giấu vào hang
Trứng được lấy ra theo thứ tự {100,100,100}, {100,100,102}, {130, 100, 150},
{100,100,100}, {100,110,100} và giấu vào hang