Giới thiệu
Một đĩa là một thùng chứa tuyến tính với các khối được lập chỉ mục 0
thông qua size-1
.
Một tệp là một danh sách có tên của các chỉ mục khối được sử dụng bởi tệp đó.
Một hệ thống tập tin ví dụ được thể hiện như thế này:
15 ALPHA=3,5 BETA=11,10,7
"Đĩa có 15 khối, khối đầu tiên của tệp ALPHA là khối đĩa ở chỉ mục 3 ..."
Bản đồ đĩa có thể được vẽ như thế này:
Block Index 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14
Contents | | | |A0 | |A1 | |B2 | | |B1 |B0 | | | |
Một đĩa được coi là phân mảnh khi tất cả các tệp trong đó được lưu trữ liên tục.
MỤC TIÊU CỦA BẠN:
Phát ra một chuỗi ngắn nhất của các động thái hợp pháp sẽ chống phân mảnh một đĩa nhất định.
Di chuyển hợp pháp
Một di chuyển chứa ba mẩu thông tin: tên của một tệp, một chỉ mục của khối trong tệp sẽ được di chuyển và chỉ mục của khối đĩa mà nó di chuyển đến.
Ví dụ
ALPHA:1>4
"Di chuyển khối 1 của tệp ALPHA sang khối 4 của đĩa."
Sau động thái này, hệ thống tệp ví dụ bây giờ là
15 ALPHA=3,4 BETA=11,10,7
Block Index 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14
Contents | | | |A0 |A1 | | |B2 | | |B1 |B0 | | | |
Khối đĩa có người ở trước đó bị xóa hoàn toàn. Tương tự, bạn có thể xem điều này như hoán đổi hai khối trên đĩa nhưng một trong các khối trong trao đổi phải trống .
Dữ liệu có thể không bị phá hủy. Các tệp không thể chia sẻ các khối ở bất kỳ giai đoạn nào và các chuyển động phải nằm trong phạm vi của đĩa. Các động thái sau đây là bất hợp pháp : ALPHA:0>10
(thuộc sở hữu của BETA), ALPHA:3>0
(không có khối như vậy trong ALPHA), ALPHA:0>-1
(không có chỉ số đĩa như vậy), ALPHA:0>15
(chỉ mục đĩa quá lớn)
ví dụ 1
Giải quyết ví dụ trên đầy đủ.
ALPHA:0>4
BETA:0>9
BETA:2>11
Các tập tin không phải liền kề trong giải pháp, chỉ cần liên tục trong chính chúng.
Ví dụ 2
Đây là một trường hợp hạn chế hơn
Đầu vào:
10 A=1,2,3 B=6,7,8 C=4,5,0
Đầu ra:
B:2>9
B:1>8
B:0>7
C:2>6
Sự phát triển của hệ thống tập tin này là:
Block Index 00 01 02 03 04 05 06 07 08 09
Contents |C2 |A0 |A1 |A2 |C0 |C1 |BO |B1 |B2 | |
|C2 |A0 |A1 |A2 |C0 |C1 |BO |B1 | |B2 |
|C2 |A0 |A1 |A2 |C0 |C1 |BO | |B1 |B2 |
|C2 |A0 |A1 |A2 |C0 |C1 | |B0 |B1 |B2 |
| |A0 |A1 |A2 |C0 |C1 |C2 |B0 |B1 |B2 |
Một cách khác để chống phân mảnh điều này bằng cách C:2>9
sau đó đưa A
xuống một bước, sau đó đưa C
xuống một bước, sau đó thực hiện C:2>5
nhưng đây sẽ không phải là một giải pháp hợp pháp vì nó chứa nhiều di chuyển hơn so với thay thế .
Đại diện
Bạn có thể sử dụng bất kỳ biểu diễn nào cho đầu vào miễn là nó gần với chuỗi cơ bản. Tùy thuộc vào ngôn ngữ của bạn, đầu vào của ví dụ đầu tiên có thể được ký hiệu là
"15 ALPHA=3,5 BETA=11,10,7"
[15," ","ALPHA","=",3,",",5," ","BETA","=",11,",",10,",",7]
(15,(("ALPHA",(3,5)),("BETA",(11,10,7))))
etc
Tương tự, đầu ra có thể là bất cứ điều gì thuận tiện cho ngôn ngữ của bạn khi nhật ký được in, có thể đọc được và thể hiện một danh sách các lệnh di chuyển hợp pháp, mỗi di chuyển được mô tả bởi 1) tên tệp, 2) chỉ mục chặn tệp , 3) chỉ mục khối đĩa mới
"ALPHA:1>6 BETA:2>9"
(0=>(0=>"ALPHA",1=>"1",2=>"6"), 1=>(0=>"BETA",1=>"2",2=>"9"))
["ALPHA",1,6,"BETA",2,9]
etc
Yêu cầu
Mã của bạn phải chấp nhận bất kỳ kích thước đĩa, và bất kỳ số lượng và kích thước của tệp.
Các đầu vào không mô tả trạng thái hệ thống tập tin ban đầu hợp pháp có thể dẫn đến hành vi không xác định.
Mã của bạn phải tạo ra một giải pháp di chuyển ngắn nhất , cho bất kỳ đầu vào nào được xác định rõ.
Tất cả các động thái bạn sản xuất phải hợp pháp; hệ thống tập tin phải ở trạng thái hợp lệ sau khi áp dụng từng bước bạn sản xuất.
Mã của bạn phải chấm dứt cho tất cả các đầu vào hợp lệ, nghĩa là nó sẽ không bao giờ bị kẹt trong một vòng lặp, hệ thống tập tin phải ở trạng thái mới rõ ràng sau mỗi lần di chuyển được áp dụng.
Trong trường hợp tồn tại nhiều hơn một giải pháp ngắn nhất, bất kỳ giải pháp nào cũng có thể được chọn là hợp lệ.
Mã ngắn nhất sẽ thắng. Vui lòng gửi ít nhất một đầu vào ví dụ không cần thiết mới và đầu ra của nó với mã của bạn.