จัดเรียงอาร์เรย์สองมิติที่เต็มไปด้วยสัญญาณรบกวนโดยการสลับตัวเลขที่อยู่ติดกัน [ปิด]


9

อาร์เรย์สองมิติที่มีขนาด n × n เต็มไปด้วยตัวเลข n * n โดยเริ่มจากหมายเลข 1 ตัวเลขเหล่านั้นจะถูกจัดเรียงต่อแถวตามลำดับจากน้อยไปมาก จำนวนแถวแรกจะต้องมากกว่าจำนวนสุดท้ายของแถวก่อนหน้า (จำนวนที่น้อยที่สุดของทั้งหมด (1) จะอยู่ใน [0,0]) นี้มีความคล้ายคลึงกับ15 ปริศนา

นี่คือตัวอย่างเช่นอาร์เรย์เรียงขนาดn = 3

1 2 3
4 5 6
7 8 9

อินพุต

อินพุตเป็นสัญญาณรบกวน สามารถมีขนาดใดก็ได้สูงสุด n = 10 ตัวอย่างสำหรับ n = 3:

4 2 3
1 8 5
7 9 6

เอาท์พุต

เอาต์พุตรายการswaps ที่ต้องการเพื่อจัดเรียงอาร์เรย์ การสลับถูกกำหนดดังนี้: หมายเลขที่อยู่ติดกันสองตำแหน่งการสลับไม่ว่าจะเป็นแนวนอนหรือแนวตั้ง ไม่อนุญาตให้ทำการเปลี่ยนแนวทแยง

ตัวอย่างเอาต์พุตสำหรับตัวอย่างด้านบน:

  • สลับ 4 และ 1
  • สลับ 8 และ 5
  • สลับ 8 และ 6
  • แลกเปลี่ยน 9 และ 8

การแลกเปลี่ยนที่ต้องการน้อยก็จะดีขึ้น เวลาในการคำนวณจะต้องเป็นไปได้


นี่คือตัวอย่างอินพุตอื่นโดยมี 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

ถ้าฉันไม่เข้าใจผิดนี่จะต้องใช้ประมาณ 1,000-2,000 swaps


นี่เป็นปริศนาความเร็วหรือปัญหาการเล่นกอล์ฟหรือไม่
Michael Klein

@MichaelKlein นี่คือปริศนา
JCarter

เป็นคะแนนหรือไม่ ช่วงใดที่ต้องจัดการ
Michael Klein

1
@ สตีฟเวอร์ริลล์ฉันกลัวว่ามันเป็นไปไม่ได้เลยที่จะแก้ปัญหา n = 10 ตัวอย่างในเวลาน้อยกว่า 100 ครั้ง (หรือแม้แต่ 1,000; แต่โปรดพิสูจน์ว่าฉันผิด) แต่ถึงกระนั้นจำนวนของการแลกเปลี่ยนคือเกณฑ์การชนะ (แม้ว่าการคำนวณจะต้องเป็นไปได้!) ผู้ที่แก้ปัญหาด้วยจำนวนการแลกเปลี่ยนที่น้อยที่สุดจะชนะ
JCarter

1
@JCarter ฉันคิดว่าคุณตั้งใจจะบอกว่าอาจมีการแลกเปลี่ยนตัวเลขที่อยู่ติดกันเท่านั้น
quintopia

คำตอบ:


3

Mathematica ไม่ใช่นักกอล์ฟ

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]]]

คำอธิบาย :

อัลกอริทึมคล้ายกับ "การจัดเรียงฟอง" หมายเลข 100 เหล่านี้จะถูกเรียงลำดับอย่างถูกต้องทีละหนึ่ง, 1, 11, 21, ..., 91; 2, ..., 92; ...; 10, ..., 100. โดยจะเลื่อนขึ้น / ลงไปยังแถวที่ถูกต้องก่อนจากนั้นเลื่อนไปทางซ้ายไปยังคอลัมน์ที่ถูกต้อง

ฟังก์ชั่นtowardsให้ทั้งสองตำแหน่งเพื่อสลับ ตัวอย่างเช่นถ้า{5,2}จะย้ายไป{1,1}, towards[{5,2},{1,1}]ให้{{5,2},{5,1}}(เลื่อนขึ้น); และ towards[{5,1},{1,1}]ให้{{5,1},{4,1}}(เลื่อนไปทางซ้าย)


ผลลัพธ์ :

สำหรับกรณีทดสอบจำนวนรวมของการแลกเปลี่ยนคือ 558 การสลับสองสามครั้งแรกคือ

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

สำหรับการกำหนดค่าแบบสุ่มจำนวนรวมของการแลกเปลี่ยนคือ558.5 ± 28.3 (1σ)

ป้อนคำอธิบายรูปภาพที่นี่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.