Vấn đề
Giả sử bạn có N ngăn xếp có tên S 1 đến S N , trong đó mỗi S k (k = 1 đến N) chứa N bản sao của số k.
Ví dụ: khi N = 3, các ngăn xếp trông như thế này:
1 2 3 <- top of stack
1 2 3
1 2 3 <- bottom of stack
=======
1 2 3 <- stack index
Ở đây có 3 ngăn xếp được lập chỉ mục là 1, 2 và 3 và mỗi ngăn chứa N thể hiện của chỉ mục riêng.
Mục tiêu là sắp xếp lại các ngăn xếp N sao cho mỗi ngăn chứa chúng giống hệt nhau chứa các số từ 1 đến N theo thứ tự từ trên xuống dưới.
ví dụ: với N = 3, mục tiêu là sắp xếp lại các ngăn xếp thành:
1 1 1
2 2 2
3 3 3
=======
1 2 3
Hành động duy nhất bạn có thể thực hiện với các ngăn xếp là lấy số cao nhất từ một trong các ngăn xếp (bật lên) sau đó ngay lập tức đặt nó lên trên một ngăn xếp khác (đẩy) . Điều này tuân theo các quy định sau:
Một số chỉ có thể được đẩy lên một ngăn xếp nếu nó nhỏ hơn hoặc bằng số trên cùng của ngăn xếp đó.
ví dụ: a
1
có thể được đẩy lên một ngăn xếp có a1
,2
hoặc3
ở trên cùng, nhưng2
chỉ có thể được đẩy lên một ngăn xếp có một2
hoặc3
(hoặc cao hơn) ở trên cùng.Điều này có tác dụng là các ngăn xếp luôn tăng đơn điệu từ trên xuống dưới.
Bất kỳ ngăn xếp không trống nào có thể được bật ra và, giả sử viên đạn trước đó được thỏa mãn, bất kỳ ngăn xếp nào cũng có thể được đẩy tới.
Bất kỳ số nào có thể được đẩy vào một ngăn xếp trống.
Ngăn xếp không có giới hạn chiều cao tối đa.
Ngăn xếp không thể được tạo ra hoặc phá hủy, luôn có N trong số chúng.
Thử thách này là về việc quyết định nên bật và đẩy để làm gì để hoàn thành việc trao đổi ngăn xếp, không nhất thiết là trong một vài động tác, nhưng theo một cách chắc chắn.
(Thực hành với một cỗ bài là một cách tốt để cảm nhận vấn đề.)
Thử thách
Viết chương trình hoặc hàm lấy số nguyên dương N, được đảm bảo là 3 hoặc cao hơn. In hoặc trả về một chuỗi biểu thị tất cả các hành động đẩy pop cần thiết để sắp xếp lại các ngăn xếp từ trạng thái ban đầu:
1 2 3 4 5
1 2 3 4 5
1 2 3 4 5
1 2 3 4 5
1 2 3 4 5
=============
1 2 3 4 5
(N = 5 trường hợp)
Đến trạng thái cuối cùng:
1 1 1 1 1
2 2 2 2 2
3 3 3 3 3
4 4 4 4 4
5 5 5 5 5
=============
1 2 3 4 5
Mỗi dòng trong đầu ra của bạn phải chứa hai số cách nhau bởi một khoảng trắng. Số đầu tiên là chỉ mục của ngăn xếp bật lên và số thứ hai là chỉ mục của ngăn xếp để đẩy tới. Thực hiện các hành động của tất cả các dòng theo thứ tự nên sắp xếp các ngăn xếp chính xác mà không vi phạm bất kỳ quy tắc nào.
Ví dụ: đây là một đầu ra hợp lệ tiềm năng cho trường hợp N = 3:
1 2 [move the top number on stack 1 to the top of stack 2]
1 2 [repeat]
1 2 [repeat]
3 1 [move the top number on stack 3 to the top of stack 1]
2 3 [etc.]
2 3
2 3
2 1
2 1
2 1
3 1
3 1
3 1
3 2
1 2
1 2
1 2
1 3
2 3
2 3
2 3
1 2
3 2
3 1
Ghi chú
Đầu ra của bạn không cần phải tối ưu , chỉ đúng. tức là bạn không cần giảm thiểu số lần bật và đẩy.
- Vì vậy, sẽ ổn thôi nếu, nói rằng, một số động thái được lặp đi lặp lại và ngay lập tức đảo ngược.
- Popping và đẩy vào cùng một ngăn xếp trong một lần di chuyển, ví dụ
2 2
, cũng được cho phép (mặc dù tất nhiên là vô nghĩa).
Đầu ra của bạn không cần phải xác định và hữu hạn.
Hãy nhớ rằng ngăn xếp có chỉ mục 1 dựa trên. Lập chỉ mục dựa trên 0 không được phép.
N lớn hơn 9 nên tất nhiên chỉ hoạt động tốt như một chữ số N
Nếu muốn, bạn có thể sử dụng bất kỳ hai ký tự ASCII có thể in khác nhau, không có chữ số thay cho dấu cách và dòng mới. Một dòng mới (hoặc thay thế dòng mới) trong đầu ra là tốt.
Chấm điểm
Mã ngắn nhất tính bằng byte thắng. Tiebreaker là câu trả lời bình chọn cao hơn.
Điểm brownie vô giá trị nếu bạn có thể hiển thị thuật toán của mình là tối ưu.
-._(._.)_.-
N=3
tối ưu?