Sắp xếp mảng hai chiều được xáo trộn chứa đầy các số bằng cách hoán đổi các số liền kề [đã đóng]


9

Một mảng hai chiều có kích thước n × n được lấp đầy bằng các số n * n, bắt đầu từ số 1. Các số đó sẽ được sắp xếp trên mỗi hàng theo thứ tự tăng dần; số đầu tiên của một hàng phải lớn hơn số cuối cùng của hàng trước đó (số nhỏ nhất của tất cả (1) sẽ nằm trong [0,0]). Điều này tương tự như 15 câu đố .

Đây là, ví dụ, một mảng được sắp xếp có kích thước n = 3 .

1 2 3
4 5 6
7 8 9

Đầu vào

Đầu vào là một mảng được xáo trộn. Nó có thể có kích thước bất kỳ lên tới n = 10. Ví dụ cho n = 3:

4 2 3
1 8 5
7 9 6

Đầu ra

Xuất ra một danh sách các giao dịch hoán đổi cần thiết để sắp xếp mảng. Một trao đổi được định nghĩa như sau: Hai vị trí hoán đổi số liền kề , theo chiều ngang hoặc chiều dọc; hoán đổi đường chéo là không được phép.

Ví dụ đầu ra cho ví dụ trên:

  • Hoán đổi 4 và 1
  • Hoán đổi 8 và 5
  • Hoán đổi 8 và 6
  • Hoán đổi 9 và 8

Càng ít giao dịch hoán đổi, càng tốt. Thời gian tính toán phải khả thi.


Đây là một ví dụ đầu vào khác, với n = 10:

41 88 35 34 76 44 66 36 58 28
6 71 24 89 1 49 9 14 74 2
80 31 95 62 81 63 5 40 29 39
17 86 47 59 67 18 42 61 53 100
73 30 43 12 99 51 54 68 98 85
13 46 57 96 70 20 82 97 22 8
10 69 50 65 83 32 93 45 78 92
56 16 27 55 84 15 38 19 75 72
33 11 94 48 4 79 87 90 25 37
77 26 3 52 60 64 91 21 23 7

Nếu tôi không nhầm, điều này sẽ cần khoảng 1000-2000 giao dịch hoán đổi.


Đây có phải là một câu đố, tốc độ, hoặc vấn đề golf?
Michael Klein

@MichaelKlein Đây là một câu đố.
JCarter

Là nó ghi bàn? Những phạm vi cần phải được xử lý?
Michael Klein

1
@steveverrill Tôi e rằng không thể giải quyết ví dụ n = 10 trong ít hơn 100 lần hoán đổi (hoặc thậm chí 1000; nhưng vui lòng chứng minh tôi sai). Tuy nhiên, số lượng giao dịch hoán đổi là tiêu chí chiến thắng (mặc dù tính toán phải khả thi!), Người đưa ra giải pháp có số lần hoán đổi thấp nhất sẽ thắng.
JCarter

1
@JCarter Tôi nghĩ bạn muốn nói rằng chỉ các số liền kề có thể được hoán đổi?
quintopia

Câu trả lời:


3

Toán học, không chơi gôn

towards[a_,b_]:={a,a+If[#==0,{0,Sign@Last[b-a]},{#,0}]&@Sign@First[b-a]};
f[m_]:=Block[{m2=Map[QuotientRemainder[#-1,10]+1&,m,{2}]},
  Rule@@@Apply[10(#1-1)+#2&,#,{2}]&@
    Reap[Table[
      m2=NestWhile[
        Function[{x},x/.(Sow[#];Thread[#->Reverse@#])&[x[[##]]&@@@towards[First@Position[x,i,{2}],i]]]
        ,m2,#~Extract~i!=i&];
      ,{i,Reverse/@Tuples[Range[10],2]}];][[2,1]]]

Giải thích :

Thuật toán tương tự như "sắp xếp bong bóng". 100 số này được sắp xếp theo đúng thứ tự từng cái một 1, 11, 21, ..., 91; 2, ..., 92; ...; 10, ..., 100. Đầu tiên chúng di chuyển lên / xuống các hàng chính xác, sau đó di chuyển sang trái vào các cột chính xác.

Chức năng towardscho hai vị trí để trao đổi. Ví dụ, nếu {5,2}đang di chuyển đến {1,1}, towards[{5,2},{1,1}]cho {{5,2},{5,1}}(di chuyển lên); và towards[{5,1},{1,1}]cho {{5,1},{4,1}}(di chuyển sang trái).


Kết quả :

Đối với trường hợp thử nghiệm, tổng số lần hoán đổi là 558. Một vài lần hoán đổi đầu tiên là,

{1->76,1->34,1->35,1->88,1->41,11->16,11->69,11->46, ...

Đối với cấu hình ngẫu nhiên, tổng số lần hoán đổi là 558,5 ± 28,3 (1σ).

nhập mô tả hình ảnh ở đây

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.