You are on page 1of 9

Võ Tiến

Cấu Trúc Dữ Liệu Và Giải Thuật

Bài tập lớn 1


JJK RESTAURANT OPERATIONS

nhóm thảo luận CSE


https://www.facebook.com/groups/211867931379013

Tp. Hồ Chí Minh, Tháng 10/2023

https://www.facebook.com/groups/211867931379013 Trang 1/11


Nhóm thảo luận CSE
Võ Tiến

Mục lục
1 Kiến thức cần có 3

2 Task1 RED 5
2.1 Hiện Thực . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
2.2 Test Case . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6

3 Task2 BLUE 7
3.1 Phân tích hàm BLUE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
3.2 Hiện Thực . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
3.3 Test Case . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8

4 Task3 DOMAIN_EXPANSION 9
4.1 Phần tích hàm DOMAIN_EXPANSION . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
4.2 Hiện Thực . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
4.3 Test case . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10

https://www.facebook.com/groups/211867931379013 Trang 2/11


Nhóm thảo luận CSE
Võ Tiến

HƯỚNG DẪN CHO CÁC BẠN MỚI VÔ SAU NGÀY 10/10


(BTL mẫu 2)

1 Kiến thức cần có


• Danh sách liên kết đôi
• Danh sách liên kết vòng

• Sell sort

1 class customer {
2 public:
3 string name;
4 int energy;
5 customer* prev;
6 customer* next;
7 friend class Restaurant;
8 public:
9 customer(){}
10 customer(string na, int e, customer* p, customer *ne)
11 : name(na), energy(e), prev(p), next(ne){}
12 void print() {
13 cout << name << "-" << energy << endl;
14 }
15 };

• N AM E: một chuỗi ký tự trong bảng chữ cái Alphabet (bao gồm cả chữ viết thường và viết hoa)
liên tục không có khoảng trắng, biểu thị tên của khách hàng.
• EN ERGY : một số nguyên biểu thị năng lượng của các chú thuật sư (giá trị dương), và oán linh
(giá trị âm).
• N U M : một số nguyên với ý nghĩa khác nhau ứng với từng lệnh xử lý khác nhau. Và ứng với mỗi
lệnh thì giá trị NUM này sẽ có các khoảng giá trị khác nhau.
• M AXSIZE: số lượng bàn tối đa mà nhà hàng có thể phục vụ. Tuy nhiên giá trị này có thể tạm
thời thay đổi trong quá trình vận hành nhà hàng.

1 class customerTime{
2 public:
3 customer * data; //! vị trí của thằng này trong nhà hàng
4 customerTime* next; //! thằng phái trước nó
5 customerTime* prev; //! thằng phái sau nó
6 bool inDisk; //! xem thử nó có trong bàn hay không
7 public:
8 customerTime(customer * data, bool inDisk, customerTime* next = nullptr,
,→ customerTime* prev = nullptr)
9 :data(data),next(next),prev(prev), inDisk(inDisk) {}
10 ~customerTime(){}
11 };

https://www.facebook.com/groups/211867931379013 Trang 3/11


Nhóm thảo luận CSE
Võ Tiến

• ý tưởng class này dùng để lưu vị trí của khách hàng đang ở đâu trong nhà hàng có thể là trong
bàn ăn ở vị trí số mấy hoặc có thể trong hàng chờ vị trí nào

• data này lưu vị trí của khách hàng.


• next là khách hàng mới vô trước khách hàng hiện tại
• prev là khách mới vô sau khách hàng hiện tại

• inDisk xem thử khách hàng đang ngồi ăn hay làm đang chờ vô để ăn

1 customer * customerQueue; //! lưu vị trí đầu tiên của khách hàng trong queue
2 customer * customerX; //! lưu vị trí của khách hàng vừa cập nhật trong bàn ăn
3

4 int sizeCustomerInDesk; //! số lượng khách hàng trong bàn ăn


5 int sizeCustomerQueue; //! số lượng khách hàng trong hàng chờ
6

7 customerTime * CustomerTimeHead; //! khách hàng đầu tiên tới nhà hàng
8 customerTime * CustomerTimeTail; //! khách hàng cuối cùng tới nhà hàng

• customerX là khách hàng vừa mới được vô hay được thay đổi lưu trữ danh sách các khách hàng
trong bàn ăn khách hàng này sẽ thay đổi khi thêm khách và xóa khách -> Khách hàng trong bàn
ăn được biểu diễn danh sách liên kết vòng đôi
• customerQueue này cũng giống khách hàng x nhưng này là khách hàng đầu tiên đang đợi vào nhà
hàng khách hàng này chỉ khi thay đuổi khi bị đuổi về hoặc khách hàng từ hàng chờ vào bàn ăn ->
Khách hàng trong hàng chờ được biểu diễn danh sách liên kết vòng đôi
• sizeCustomerInDesk số lượng khách trong bàn ăn
• sizeCustomerQueue số lượng khách trong hàng chờ

• CustomerT imeHead lưu vị trí của khách hàng đến nhà hàng sớm nhất , CustomerT imeT ail lưu
vị trí của khách hàng mới tới gần nhất (vô sau cùng) -> Danh sách lưu vị trí của khách hàng là
danh sách liên kết đôi

https://www.facebook.com/groups/211867931379013 Trang 4/11


Nhóm thảo luận CSE
Võ Tiến

2 Task1 RED
2.1 Hiện Thực
Mô tả: Hàm này có chứ năng là sắp xếp vị trí chỗ ngồi cho khách. Thực hiện theo các bước sau

1. Bước 1: Nhà hàng chỉ tiếp đón chú thuật sư (ENERGY dương) hoặc oán linh (ENERGY âm) và
từ chối nhận khách hàng có ENERGY bằng 0. -> ENERGY bằng 0 đuổi khách về
2. Bước 2: Hàng chờ đã đạt đến số lượng tối đa thì nhà hàng sẽ ngưng nhận khách. -> Hàng chờ đầy
đuổi khách về
3. Bước 3: Và bởi vì "thiên thượng thiên hạ, duy ngã độc tôn", nên nhà hàng sẽ không đón tiếp các
vị khách đến sau và không cho phép vào hàng chờ nếu có tên giống với tên của các vị khách đang
dùng bữa trong nhà hàng (hoặc đã có tên trong hàng chờ). Ví dụ một chú thuật sư tên ABC đang
dùng bữa thì những chú thuật sư hoặc oán linh đến sau có tên ABC sẽ bị mời về. -> xét thử
khách hàng trong hàng chờ và trong bàn có chung tên không, nếu chung thì đuổi khách về, ta sẽ sử
dụng CustomerT imeHead để tìm kiếm khách hàng chung tên bằng cách CustomerT imeHead− >
data− > name
4. Bước 4: Nếu số lượng khách ngồi vào bàn đã đạt đến MAXSIZE thì sẽ dừng việc nhận khách và
đưa khách vào hàng chờ

(a) Bước 4.1: xét xem trong hàng chờ có người nào không -> chèn trường hợp size=0 tương đương
với chèn lần đầu danh sách liên kết vòng đôi cập nhật CustomerQueue
(b) Bước 4.2: Thêm khách hàng vào cuối hàng chờ thêm tại ví trí cuối tail có nghĩa là thêm vào
trước thằng đầu tiên CustomerQueue
(c) Bước 4.3: biến quản lý thời gian khách hàng nào đến trước giống như 1 sổ kí lưu vị trí khách
hàng Phần này thêm vào cuối danh sách vị trí khách hàng dùng CustomerT imeT ail
5. Bước 5: Khách hàng đầu tiên vào quán -> Thêm khách hàng vào danh sách và cập nhật customerX
và size, tương đương chèn lần đầu danh sách liên kết vòng đôi, và cập nhật biến quản lý thời
gian khách hàng nào đến trước giống như 1 sổ kí lưu vị trí khách hàng CustomerT imeT ail và
CustomerT imeHead

6. Bước 6: Tuy nhiên, khi số lượng khách trong bàn lớn hơn hoặc bằng MAXSIZE/2. Nhân viên sẽ
đổi chiến lược chọn chỗ ngồi cho khách. Vì biết những người có ENERGY gần bằng nhau thường
không thích ngồi gần nhau. Do đó trước khi chọn vị trí, nhân viên sẽ tính giá trị chênh lệch lớn
nhất giữa vị khách mới với tất cả vị khách trong nhà hàng thông qua việc lấy hiệu trị tuyệt đối của
từng cặp ENERGY ứng với từng khách hàng (giả sử gọi là RES) để quyết định chỗ ngồi. -> Nếu
vào trường hợp này cần tìm vị trí X mới, vì khi thay đổi X tại vị trí mớ ta có thể tận dụng được
code bước 7, khi đó khách hàng có hiệu tuyệt đối ENEGY cực đại sẽ tương đương với khách hàng
X, bước này dùng vòng for so sánh thôi
7. Bước 7: Khi vị khách tiếp theo đến, nhân viên sẽ bố trí chỗ ngồi cho khách tại vị trí liền kề bên phía
thuận chiều kim đồng hồ nếu ENERGY của khách lớn hơn hoặc bằng với ENERGY của khách tại
vị trí X. Ngược lại, khách sẽ ngồi tại vị trí liến kề bên phía ngược chiều kim đồng hồ của khách tại
vị trí X -> Tạo Thông tin khách hàng mới sau đó cập nhật next prev của khách hàng mới khi thêm
vào và cập nhật khác hàng trước khác hàng mới và sau khách hàng mới. Cập nhật CustomerX và
size
(a) thêm khách hàng mới vào phía trước khác hàng X, dùng x->next xử lí.
(b) thêm khác hàng mới vào sau khách hàng X, dùng x->prev xử lí.
(c) /biến quản lý thời gian khách hàng nào đến trước giống như 1 sổ kí lưu vị trí khách hàng như
bước 4.3.

https://www.facebook.com/groups/211867931379013 Trang 5/11


Nhóm thảo luận CSE
Võ Tiến

Hình 1: Bước 7 hướng dẫn cách thêm node mới


2.2 Test Case
1. Test 1: xét bước 1, bước 3, bước 5. chú ý cái else cuối hàm Light đổi thành else if(number < 0)

2. Test 2: Chèn theo chiều kim đồng hồ của Bước 7 và print theo chiều kim đồng hồ
3. Test 3: Chèn theo ngược đồng hồ của Bước 7 và print theo chiều kim đồng hồ
4. Test 4: Chèn theo chiều kim đồng hồ của Bước 7 và print theo ngược chiều kim đồng hồ

5. Test 5: Chèn theo ngược đồng hồ của Bước 7 và print theo ngược chiều kim đồng hồ
6. Test 6: xét Bước 6 với MAXSIZE chẵn
7. Test 7: xét Bước 7 với MAXSIZE lẻ
8. Test 8: xét bước 4, bước 3, bước 2.

9. Test 9 -> 100: random.


10. phần này nếu chạy hết thì dùng lệnh dưới hướng dẫn tử [i,j] tương đương [1,100]

https://www.facebook.com/groups/211867931379013 Trang 6/11


Nhóm thảo luận CSE
Võ Tiến

3 Task2 BLUE
3.1 Phân tích hàm BLUE

1 void imp_res::BLUE(int num)


2 {
3 //* Không có khách lấy gì xóa :<
4 //& nhà hàng méo còn khách mà ông chủ bắt đuổi
5 if(sizeCustomerInDesk == 0) return;
6

7 //* Bước 1 số lượng khách hàng bị đuổi


8 //& chạy KPI số khách đuổi để nộp lên sếp nào không ổng trừ lương nữa
9 for(int i = 0; i < num && sizeCustomerInDesk != 0; i++)
10 {
11 //* Bước 1.1 Tìm khách chuẩn bị đuổi và xóa khỏi danh sách Time
12 customerTime* customerTimeDelete = CustomerTimeHead;
13 //TODO
14

15 //* Bước 1.2 đuổi khách trong bàn


16 this->delteCustomerInDisk(customerTimeDelete);
17 delete customerTimeDelete;
18 }
19

20 //* Bước 2 xử lý đưa khách hàng từ hàng chờ vào bàn ăn


21 this->insertCustomerQueueToInDisk();
22 }

• customerT imeDelete là biến lưu trữ vị trí của khách hàng chuẩn bị xóa
• ở bước 1 ta thực hiện xóa khách hàng ra khỏi bàn ăn, bước 1.1 ta hiện thực tìm kiếm khách hàng
tới lâu nhất mà đang ngồi trong bàn ăn, bước 1.2 là ta có vị trí ở bước 1.1 ta tới chỗ khách hàng
và mời khách hàng về
• ở bước 2 sau khi xóa hết num khách hàng ta xem hàng chờ còn khách không để đưa khách vào bàn
• hàm delteCustomerInDisk() tới chỗ khách hàng và mới khách hàng về
• hàm insertCustomerQueueT oInDisk() thêm khách hàng từ hàng chờ vào bàn

3.2 Hiện Thực


1. Bước 1 Khi nhận được lệnh, nhân viên sẽ đuổi NUM vị khách theo thứ tự vào nhà hàng từ sớm
nhất đến gần đây nhất. Ví dụ: khách đến nhà hàng theo thứ tự A → B → C → D thì sau khi thực
thi lệnh BLUE 2 thì trong nhà hàng chỉ còn hai vị khách là C và D. Trường hợp nếu NUM lớn hơn
hoặc bằng số lượng khách trong bàn ăn hoặc lớn hơn MAXSIZE thì xem như chủ nhà hàng quyết
định đuổi hết khách trong bàn ăn. Dùng phòng for duyệt qua từng khách hàng bị đuổi.
(a) Bước 1.1 ta thực hiện chọn khách hàng đến sớm nhất đang ngồi ăn trong bàn (inDisk = true)
sau khi ta đã tìm thấy thì xóa vị trí khách hàng này ra khỏi danh sách vị trí (CustomerT ime).
(b) Bước 1.2 ta thực hiện tới chỗ khách hàng thông qua data của CustomerT ime, tới vị trí khách
hàng đang ăn và mời về thông qua hàm delteCustomerInDisk() đặt tả hàm này như sau
• Bước 1 đuổi khách hàng trong bàn ăn khi chỉ có 1 khách hàng ta thực hiện cập nhật
customerX
• Bước 2 đuổi khách hàng khi trong bàn có nhiều hơn 1 khách, ta tới chỗ khách hàng
bằng customerDelete = customerT imeDelete− > data ta thấy khách hàng rồi thì mời
khách hàng về cập nhật lại 2 anh khách hàng kế bên (next của khách hàng sau và prev

https://www.facebook.com/groups/211867931379013 Trang 7/11


Nhóm thảo luận CSE
Võ Tiến

của khách hàng trước) giống như xóa 1 node ra khỏi danh sách liên kết vòng đôi và cập
nhật lại khác hàng X (Nếu mà khách có energy > 0 thì chọn khách hàng X là khách
hàng phía trước của khách hàng chuẩn bị xóa, ngược lại (phần này trong fourm thầy có nói)

• Bước 3 cập nhật size


2. Bước 2 Sau khi dọn xong, nếu trong hàng chờ có khách, nhân viên sẽ tiến hành chọn chỗ cho khách,
ngược lại không làm gì cả. Lưu ý: việc chọn chỗ ngồi mới cho khách trong hàng chờ chỉ được thực
hiện sau khi đã thực hiện xong lệnh BLUE. Cơ chế chọn chỗ ngồi cho khách tương tự như lệnh RED
và thứ tự của khách được xem xét ngồi vào bàn từ hàng chờ sẽ theo cơ chế First In First Out (FIFO).
-> Tiên hành đưa khách hàng từ hàng chờ vào bàn ăn bằng vòng lặp for, thực hiện giảm số lượng
khách hàng chờ và đưa khách vào bàn ăn được đặt tả trong hàm insertCustomerQueueT oInDisk()
(a) bước 1 đưa khách hàng đầu ra khỏi hàng chờ ta sẽ tiến hành chọn khách hàng đầu
customerQueue ra khỏi hàng chờ thành newCustomer
• bước 1.1 tìm khách hàng trong danh sách Time và cập nhật inDisk vì khách hàng luôn
này đã ra ngoài hàng chờ để vào bàn ta tiến hành cập nhật inDisk
• bước 1.2 xóa khách hàng newCustomer ra khỏi hàng chờ (giống xóa 1 node ở đầu của
danh sách liên kết vòng đôi)
(b) bước 2 thêm khách hàng vào bàn ăn ta tiến hành đưa newCustomer vào bàn ăn này giống
T ASK1(RED) giống bước 5,6,7

3.3 Test Case


1. Test 101: xét bước 1.1 xem thử nếu xóa 1 khách hàng trong bàn có duy nhất 1 khách hàng có lỗi
gì không.
2. Test 102: xét tại bước 1.2 xem thử xóa từng khách hàng trong bàn có lỗi gì không, thêm trước rồi
xóa (không vừa thêm vừa xóa)

3. Test 103: xét tại bước 1.2 xét phần cập nhật lại khách hang X, và number > 1
4. Test 104: xóa khách hàng với number số lớn
5. Test 105 - 109: xét bước 2 khi thêm vào hàng chờ
6. 110 - 200: random

7. phần này nếu chạy hết thì dùng lệnh dưới hướng dẫn tử [i,j] tương đương [101,200]

https://www.facebook.com/groups/211867931379013 Trang 8/11


Nhóm thảo luận CSE
Võ Tiến

Anh đang mở lớp dạy DSA cho BTL1 + GK + LAB


nhóm thảo luận CSE
https://www.facebook.com/groups/211867931379013
CHÚC CÁC EM HỌC TỐT

https://www.facebook.com/groups/211867931379013 Trang 9/11


Nhóm thảo luận CSE

You might also like