Dominosa NP-Hard หรือไม่


26

Dominosa เป็นเกมตัวต่อปริศนาที่ค่อนข้างใหม่ มันเล่นบน กริดก่อนที่เกมจะเริ่มขึ้นกระดูกโดมิโน ถูกวางลงบนตาราง (ประกอบเป็นกระเบื้องที่สมบูรณ์แบบ ) ในขั้นตอนต่อไปกระดูกโดมิโนจะถูกซ่อนไว้เหลือเพียงตัวเลขที่เปิดเผย จุดประสงค์ของเกมคือการกู้คืนการจัดเรียงเดิมของกระดูกโดมิโน คุณสามารถเล่นเกมได้ที่นี่: http://www.puzzle-dominosa.com/ :(n+1)×(n+2)(0,0),(0,1),,(n,n)

กฎ:

กฎนั้นง่าย คุณต้องหาที่ตั้งของแต้มทั้งหมดบนกริด โดมิโนเป็นคู่ของตัวเลข คุณสามารถมีหนึ่งในแต่ละคู่เท่านั้น

ฉันมีอัลกอริทึมพหุนามบางอย่างที่แก้ปัญหาส่วนเล็ก ๆ ของตัวต่อ ฉันสามารถแสดงให้เห็นว่ากริดโดมิโนทั่วไปมีอย่างน้อยวิธีแก้ปัญหา2n2+o(n)

Dominosa NP-Hard หรือไม่


"ปริศนาอาจลดลงอย่างง่ายดายถึงปัญหา SAT หรือ ILP" เพื่อพิสูจน์ความสมบูรณ์แบบของ NP คุณไม่ต้องการวิธีอื่น ๆ ใช่ไหม
Dennis Meng

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

ฉันสมมติว่าปัญหาที่ปัญหาความสมบูรณ์ของปัญหาอยู่ที่การจัดเรียงตัวเลขมาจากการจัดเรียงของ Dominos หากปัญหาคือแสดงการจัดเรียงของ Dominos จริง ๆ (เมื่อมีอยู่) แสดงว่าปัญหาไม่ใช่ปัญหาในการตัดสินใจและ "NP สมบูรณ์" ไม่สมเหตุสมผล

@AndreasBlass One สามารถพิจารณาปัญหาที่ใหญ่กว่าได้: กำหนดองค์ประกอบย่อยของ Dominos ตั้งแต่ถึงและกราฟมีจุดยอดมีป้ายกำกับถึงระบุว่าเป็นไปได้หรือไม่ที่จะครอบคลุมกับ Dominos ที่กำหนด หากปัญหานี้เป็นแบบ P แสดงว่ามีอัลกอริทึม P-time ในการกู้คืนไทล์เดิมเนื่องจากคุณสามารถลองลบขอบและทดสอบใน P-time ว่าเป็นไปได้หรือไม่ที่จะทำตารางให้เสร็จสมบูรณ์ 1 n G 2 k 1 nk1nG2k1n

1
จากบทความของ G. Nordh เรียกว่า NP-ครบถ้วนสมบูรณ์ของลำดับ Skolem หลายทั่วไปปัญหาที่คล้ายกันดังต่อไปนี้คือ NP-Complete อินสแตนซ์: กราฟ , พาร์ติชันของขอบเป็นชุด disjoint:ด้วยซึ่งไม่มีสองขอบที่มีป้ายชื่อเดียวกันแบ่งปันจุดยอด คำถาม: มีส่วนย่อยมีซึ่งไม่มีจุดสองจุดใน M ที่ใช้จุดสุดยอดร่วมกันและ M นั้นมีขอบอย่างน้อยหนึ่งส่วนจากแต่ละ ? E 1 , E 2 , . . , E m , | m | | V | / 2 | E i | 2 , i = 1 , , m M E | M | = | V | / 2 E i , i = 1G=(V,E)E1,E2,...,Em,|m||V|/2|Ei|2, i=1,,mME|M|=|V|/2Ei, i=1,,m
Yoav bar sinai

คำตอบ:


9

หมายเหตุ: นี่คือความต่อเนื่องและการแก้ไขของฉันคำตอบอื่น

มีปัญหากับการลด

ระลึกถึงปัญหาการตัดสินใจ:

มีการปูกระเบื้องที่สมบูรณ์แบบครอบคลุมที่กำหนดตารางที่มีกระเบื้องที่ไม่ซ้ำกัน?n(n+1)×(n+2)n

ดังนั้นสำหรับตารางเราสามารถใช้เพียงตัวแปรn(n+1)×(n+2)n

แต่:

  • การลดลงของเราต้องใช้จำนวนมากของตัวแปรที่ไม่ซ้ำกันมากขึ้นกว่า(n)O(n)
  • นอกจากนี้สายไฟของเรายังคงเปิดให้บริการซึ่งนำไปสู่:
    • เราจะรู้ได้อย่างไรว่าเราสามารถเรียงพื้นที่เปิดโล่งได้?

เพื่อแก้ปัญหาแรกเราได้ทำให้เกมกระดานมีขนาดใหญ่ขึ้น โดยพื้นฐานแล้วเราสร้างเท่ากับจำนวนของตัวแปรที่เราต้องการจริงจากนั้นสร้างกริดที่มีขนาดและวางกริดของเราที่มุมซ้ายล่าง สิ่งนี้จะนำไปสู่การระเบิดเป็นกำลังสอง( n + 1 ) × ( n + 2 )n(n+1)×(n+2)

สำหรับปัญหาที่สองเราต้องคิดใหม่เกี่ยวกับแกดเจ็ตของเราเล็กน้อย

ดูเหมือนว่าอาจเป็นเรื่องเล็กน้อยที่จะพิสูจน์ว่าเราสามารถปูกระเบื้องกระดานที่เหลือตามกฎได้สำเร็จ ดังนั้นเราจึงเริ่มด้วยกลยุทธ์เดียวกับที่จะใช้เพื่อสร้างบอร์ดเกมขนาด :(n+1)×(n+2)

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

อย่างไรก็ตามแกดเจ็ตของเราไม่รับประกันว่าจะมีการวางกระเบื้องชุดใดชุดหนึ่ง กระเบื้องวางขึ้นอยู่กับสถานะ ดังนั้นเราจะต้องแก้ไขแกดเจ็ตอย่างระมัดระวังเพื่อรับประกันว่าจะลบไทล์ใดโดยเฉพาะ

มาดูแกดเจ็ตของเรากันดีกว่า

wire และ clause-gate นั้นมีปัญหาด้วยเหตุผลสองประการ

  1. เราไม่ทราบว่าช่องสี่เหลี่ยมที่ล้อมรอบด้วยเส้นลวดหรือประตูส่วนคำสั่งสามารถปูกระเบื้องได้อย่างถูกต้อง หลังจากทั้งหมดสายบางอย่างสามารถผลักไปทางซ้ายอื่น ๆ ไปทางขวาและการเรียงสี่เหลี่ยมพื้นที่สีขาวที่เหลือจะกลายเป็นเรื่องไม่สำคัญ เราจะอ้างถึงปัญหานี้ว่าเป็นปัญหา "ไหล"
  2. ไม่มีทางรู้ว่าไม่เป็นที่กระเบื้องจะลบออกจากกระเบื้องชุด; ในรัฐหนึ่งชุดสี่เหลี่ยมหนึ่งชุดในลวดหรือข้อเกตจะถูกปูกระเบื้องในอีกสถานะหนึ่งชุดสี่เหลี่ยมที่แตกต่างกันอย่างสิ้นเชิงจะถูกเรียงต่อกัน

ในการแก้ปัญหาเหล่านี้:

  • อันดับแรกเราสร้างชุดไพ่ทั้งหมดที่เป็นไปได้ ไพ่เหล่านี้ทั้งหมดจะต้องถูกวางไว้บนกระดาน ในขณะที่เราวางมันไว้บนกระดานเราจะลบแผ่นกระเบื้องออกจากชุด แม้ว่าในตอนแรกเราอาจไม่รู้จักเนื่องจากเรายังไม่ได้อธิบายสูตรอย่างสมบูรณ์ แต่เราสามารถเพิ่มความเป็นไปได้ของไทล์ใหม่เมื่อเราเพิ่มตามที่ต้องการ กระเบื้องทั้งหมดที่เราลบออกจากชุดนี้จะต้องรับประกันว่าสามารถวางตำแหน่งได้ (อย่างน้อยต้องได้รับการรับประกันว่าจะสามารถวางได้หากสูตรเป็นที่น่าพอใจ) เราเรียกการเอาไทล์ออกจากชุดไพ่เพื่อ "ปลด" ไทล์ออกจากชุดไพ่เพื่อที่จะปลดเปลื้องภาระหน้าที่ของเราที่จะวางไว้บนกระดานเกมnnn
  • เราจะต้องออกแบบอุปกรณ์อย่างระมัดระวังเพื่อรับประกันว่าจะลบกระเบื้องใดโดยเฉพาะไม่ว่าสถานะใดจะถูกเลือก
  • เราต้องปิดแกดเจ็ตของเราเพื่อไม่ให้มีการปูกระเบื้องทั่วกระดานโดยขึ้นอยู่กับสถานะ ค่อนข้างทุกรัฐของพวกเขาจะต้องใช้พื้นที่ที่กำหนดโดยเฉพาะเท่านั้น
    • รัฐทั้งหมดของพวกเขาจะต้องรับประกันว่าจะสามารถใช้พื้นที่ที่กำหนดไว้อย่างดี สิ่งนี้รับประกันว่าจะได้ผลงานที่น่าพอใจ แต่ไม่รับประกันว่าจะมีการเรียงต่อกันโดยเฉพาะ นี่เป็นวิธีเดียวกับที่เกมโดมิโนทำ:
      • ก่อนอื่นไพ่ถูกสร้างเป็นชุด
      • จากนั้นวางไพ่ลงในการกำหนดค่าแบบสุ่ม
      • เมื่อวางกระเบื้องแต่ละอันมันจะถูกลบออกจากชุดไพ่
      • จากนั้นกระเบื้องจะถูกลบออกจากกระดานทิ้งไว้ด้านหลังสี่เหลี่ยม
      • สิ่งนี้ไม่รับประกันว่าจะมีการเลือกการกำหนดค่าที่ต้องการ
      • แต่เป็นการรับประกันว่าสามารถเลือกการกำหนดค่าที่ต้องการได้และจึงมีวิธีแก้ไขปัญหาอยู่ เราสามารถทำสิ่งเดียวกันได้ที่นี่
  • หลังจากวางแกดเจ็ตทั้งหมดของสูตรแล้วแทนที่จะวางสี่เหลี่ยมไม่ซ้ำกันโดยค่าเริ่มต้นคือใน "ช่องว่าง" ทั้งหมดเราตรวจสอบให้แน่ใจว่าช่องว่างนั้นเป็นพื้นที่รูปสี่เหลี่ยมผืนผ้าที่มีขนาดเท่ากันหรือแยกช่องว่างลงในสี่เหลี่ยม แม้แต่มิติเดียวและเราก็เรียงช่องว่างด้วยกระเบื้องที่เหลือในชุดไพ่
  • หลังจากวางกระเบื้องทั้งหมดจากชุดเรารู้ว่าทุกอย่างจะถูกวาง
    • เห็นได้ชัดว่ามีบางตำแหน่งที่สามารถวางกระเบื้องได้เช่นในกำแพงและอื่น ๆ จะสามารถติดตั้งได้ถ้ามีสูตรที่น่าพอใจเนื่องจากลักษณะของความสัมพันธ์ระหว่างแกดเจ็ต
  • จากนั้นเราก็เอากระเบื้องออกและทิ้งไว้ข้างหลังสี่เหลี่ยม

มาดูแกดเจ็ตของเรากันดีกว่า

กำลังบังคับให้อุปกรณ์

เราสามารถสร้างบล็อคจำนวนตามอำเภอใจโดยทำให้แน่ใจว่าแต่ละบล็อคไม่สามารถจับคู่กับตัวเองได้

ตัวอย่างเช่นให้เราบอกว่าเราต้องการบังคับไพ่เพื่อให้เราสามารถใช้เป็น บล็อคอาคาร (หมายเหตุเป็นตัวแปรตามอำเภอใจซึ่งเราต้องการบังคับให้เป็นคู่กับตัวเองไม่จำเป็นต้องเป็นแบบเอกสารสำเร็จรูปในขณะที่เราใช้ค่าก่อนหน้านี้)1 1 1(1,1)111

เพื่อรับประกันว่าของเรา - การสร้างบล็อกสำรองเราจะวางมันไว้กับผนังด้านล่างใน การกำหนดค่าต่อไปนี้: เราจะวางหมายเลขที่สงวนไว้ให้เราเรียกมันว่าเทียบกับกำแพงเหมือนขึ้นตะปู (รูปร่างเหมือน ); ต่อกำแพงและอีกหนึ่งในแถวที่ 2 ที่อยู่ตรงกลาง จากนั้นเราจะใส่อีกสองตัวเลขให้เราเรียกพวกเขาว่าและ ; สิ่งเหล่านี้ไม่ซ้ำกับ gadget นี้ เราวางเหล่านี้บนซ้ายและขวาดาว}( 1 , 1 ) 1 3 231 1(1,1)13231

ภาพประกอบด้านล่างขอบสีดำที่ใช้ร่วมกันอยู่ด้านล่างของกระดานเกมคำอธิบายจากซ้ายไปขวา

  • การกำหนดค่าของอุปกรณ์ แต่ละและนี่เป็นเอกลักษณ์ของ Gadget นี้323
  • 3 รัฐเป็นไปได้ของการปูกระเบื้องศูนย์ดาว}1

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

หลังจากทำเช่นนี้เราสามารถรับประกันได้ว่าแกดเจ็ตของเราสามารถได้รับการปูกระเบื้องที่มีเฉพาะชุดของกระเบื้องในขณะที่รับประกันว่าแกดเจ็ตของเราจะต้องบังคับให้คู่ .(1,1)

  • เรารู้ว่าจะต้องเกิดขึ้นเนื่องจากทั้ง 3 สถานะที่เป็นไปได้ของการเรียงต่อกันของกระเบื้องตรงกลางเรียงเป็นดังที่แสดงในรูปด้านขวาด้านบน1 ( 1 , 1 )(1,1)1(1,1)
  • กระเบื้องที่เหลือสามารถปูกระเบื้องเป็นและซึ่งครอบคลุมแกดเจ็ต ดังนั้นเราสามารถลบกระเบื้องเหล่านั้นออกจากชุดกระเบื้องทั่วโลก ภาพประกอบด้านล่าง(1,2)(1,3)

คำอธิบายจากซ้ายไปขวา:

  • ซ้าย, บนสุด:ซ้าย, ซ้าย, ล่าง:ปูกระเบื้องที่ถูกต้องของสี่เหลี่ยมที่เหลือ
  • Middle, top:รัฐ Middle, Middle, bottom:กระเบื้องที่ถูกต้องของสี่เหลี่ยมที่เหลือ
  • ขวา, ด้านบน:สถานะด้านขวา, ด้านล่างขวา:ปูกระเบื้องที่ถูกต้องของสี่เหลี่ยมที่เหลืออยู่

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

โปรดสังเกตว่าการเรียงตัวของสี่เหลี่ยมจัตุรัสที่เหลือไม่ได้ถูกบังคับเนื่องจากสามารถเรียงต่อกับเพื่อนบ้านใกล้เคียงแทนแต่เนื่องจากเป็นการปูกระเบื้องที่ถูกต้องของเกมกระดานในทุกรัฐ เราสามารถลบพวกมันออกจากชุดไพ่ได้และสมมติว่าพวกเขาจะถูกปูกระเบื้องด้วยวิธีนั้น เนื่องจากเรารู้ว่ามีความเป็นไปได้ที่จะมีการเรียงต่อกันเรามีอย่างน้อยหนึ่งรายการที่เป็นไปได้ของเกมกระดานหากสูตรเป็นที่น่าพอใจ แม้ว่าจะไม่มีการรับประกันว่าสิ่งเหล่านี้จะได้รับการปูกระเบื้องด้วยวิธีนี้ แต่มีการรับประกันว่าแผ่นกระเบื้องจะถูกบังคับ( 1 , 1 )1(1,1)

หมายเหตุ:หากคุณไม่พอใจกับสิ่งนี้หรือสับสนกับความแตกต่างของ "ความสามารถในการเรียงภาพ" และ "ถูกบังคับให้เรียงภาพ" คุณสามารถวางกำแพงล้อมรอบGadgetเช่นเดียวกัน เราสร้างกำแพงด้านล่างสำหรับ clause-gadget3 × 23×23×2

แกดเจ็ตนี้ไม่ได้ปิดเพราะไม่จำเป็นต้อง (แต่คุณสามารถทำได้ถ้าต้องการ) ไม่จำเป็นเพราะมันมีการกำหนดค่าที่เป็นไปได้ซึ่งเราสามารถลบออกจากชุดไพ่ได้ แม้ว่ามันอาจจะเป็นไปได้ที่จะทำการกำหนดค่าที่แตกต่างกันนี้ไม่ได้ส่งผลกระทบต่อความพึงพอใจของปัญหา

กระเบื้องต่อไปนี้รับประกันว่าจะได้รับการปูกระเบื้อง (ซึ่งสามารถลบออกได้จากชุดไพ่): (1,1)

กระเบื้องต่อไปนี้รับประกันว่าจะสามารถปูกระเบื้อง (ซึ่งสามารถลบออกจากชุดไพ่ได้): (1,2),(1,3)

หากคุณเลือกที่จะปิดแกดเจ็ตนี้ด้วยกำแพงดังนั้นก็จะเป็นเช่นกัน รับประกันที่จะครอบคลุม(1,2),(1,3)

ใหม่ลวดและประตูมาตรา

เนื่องจากปัญหาการไหลและการล้างชุดกระเบื้องเราจึงต้องออกแบบลวดใหม่อีกเล็กน้อย

วิธีหนึ่งในการแก้ปัญหาการไหลคือทำให้ลวดเป็นวงจรแทนที่จะเป็นสถานะทางซ้ายขวาที่เรียบง่าย นั่นคือมันจะเป็นวงกลมแทนที่จะเป็นบรรทัดดังนั้นถ้าส่วนบนของวงกลมถูกผลักไปทางขวาล่างจะถูกผลักออกไป วิธีนี้จะช่วยแก้ปัญหาการไหล

ตามเส้นทางนี้เราสามารถเปลี่ยนลวดและประตูข้อเพื่อแก้ปัญหาทั้งสอง

กำลังสำรองและFTF

ให้เราแนะนำสองค่าสากลใหม่และF ค่าทั้งสองนี้เป็นค่าสากล ค่าจริงในตารางเช่นค่าสแควร์และ (เนื่องจากตามแบบแผนเราสงวนเป็นแบบเอกสารสำเร็จรูปสำหรับกำแพง) หรือสิ่งที่คุณเลือก พวกเขาเป็นตัวแทนของจริงและเท็จตามลำดับF 2 3 1 1TF231

เราบังคับให้จองกระเบื้อง , ,ดังต่อไปนี้; ภาพประกอบด้านล่างคำอธิบายจากซ้ายไปขวา:( T , T ) ( F , F )(T,F)(T,T)(F,F)

  • เราใช้รูปแบบเดียวกับการบังคับใด ๆกระเบื้องใช้เป็นดาว} แต่ละและนี่เป็นเอกลักษณ์ของ Gadget นี้T 1 23(1,1)T123
  • เราใช้รูปแบบเดียวกันกับการบังคับให้ไพ่โดยใช้เป็นแต่ละและที่นี่ไม่ซ้ำกับ gadget นี้F 1 23(1,1)F123
  • เราใช้รูปแบบเดียวกันกับการบังคับให้ไพ่โดยใช้เป็นที่กึ่งกลางและ กำลังใช้ในตำแหน่งอื่นของขาขึ้น กองกำลังนี้กับไทล์ และสามารถเรียงต่อกันด้วยดังนั้นเราจึงลบออกจากชุดไพ่ แต่ละและนี่เป็นเอกลักษณ์ของ Gadget นี้F 1 T ( F , T ) 23T(1,1)F1T(F,T)23T323

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

ลวด

เส้นลวดแต่ละเส้นจะเริ่มต้นและสิ้นสุดด้วยค่าให้เราเรียกว่าซึ่งเป็นสายที่ไม่ซ้ำกัน สำหรับแต่ละประโยคที่ wire เข้าร่วมนั้น wire จะมี wire-value สองค่าคือและซึ่งมีลักษณะเฉพาะสำหรับแต่ละ wire และมีส่วนร่วมใน clause เดียวกัน ภาพประกอบด้านล่างพร้อมคำอธิบายจากซ้ายไปขวาx x Axx

  • สายไฟที่เข้าร่วมในข้อเดียว ลวดมีความสูงและมีความยาวโดยที่คือจำนวนส่วนคำสั่งที่ลวดเข้าร่วมลวดจะถูกหุ้มด้วยสี่เหลี่ยมทางซ้ายสองอันและ สองอยู่ทางขวา แน่นอนว่ามันล้อมรอบด้วยกำแพงทุกด้านที่ระบุด้วยโครงร่างสีน้ำเงิน โปรดทราบว่ามีลักษณะเฉพาะกับสายนี้และจะใช้เฉพาะในสายและมีส่วนร่วมในประโยค2 p + 3 p A 1 22p+3pA1

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

ภาพประกอบด้านล่างนี้เป็นสองสถานะคำอธิบายจากซ้ายไปขวา

  • สายไฟที่เข้าร่วมในหนึ่งประโยคในสถานะที่แท้จริง ลวดถือเป็นจริงเมื่อกำลังจับคู่กับกำลังสองและกำลังจับคู่กับสี่เหลี่ยม ถือว่าเป็นเท็จในอีกสถานะหนึ่งที่เรียงต่อกัน โปรดสังเกตว่าการบังคับให้เรียงต่อกันอย่างไรเมื่อเลือกไพ่ :ถูกบังคับใช้ก่อนหน้านี้แล้วดังนั้นส่วนที่เหลือของแนวนอนจะต้องเป็นแนวนอนT x F A ( T , F )xTxFA(T,F)
  • สายเดียวกันในสถานะเท็จ

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

เมื่อเข้าร่วมในส่วนคำสั่งเพิ่มเติมมีค่ามากขึ้น และคู่หนึ่งคู่สำหรับแต่ละข้อที่ลวดเข้าร่วมพวกเขาสลับกันอยู่ด้านบนและด้านล่างเช่นเดียวกับและสี่เหลี่ยมที่แยกแต่ละคู่x T F x , x xxTFx,x

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

สถานะที่สอดคล้องกันสองสถานะ

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

แกดเจ็ตนี้ถูกปิดดังนั้นจึงไม่มี "ปัญหาการไหล"

โปรดสังเกตว่าในทั้งสองสถานะเรารวบรวมไพ่ต่อไปนี้ไม่ว่าจะเป็นรัฐ: , , mathcal)( A , T ) ( A , F )(A,A)(A,T)(A,F)

อย่างไรก็ตามมีบางกระเบื้องที่เราไม่แน่ใจ ในสถานะเดียวเราสามารถลบจากชุดไพ่ในขณะที่อยู่ในสถานะอื่นเราสามารถลบจากชุดไพ่เพื่อที่เราจะได้ ต้องการลบจริงหรือ คำตอบคือ: ประตูประโยคมีปัญหาเดียวกัน แต่มีชุดของกระเบื้องที่ตรงกันข้าม มันจะรวบรวมไพ่ที่เหลือตรงข้ามและที่ไม่ได้รวบรวมเสมอซึ่งเราจะเห็นในส่วนถัดไป เนื่องจากแต่ละรายการเหล่านี้จับคู่กับส่วนคำสั่งเราจะสามารถลบออกได้ทั้งคู่(1,T),(1,F),(2,T),(2,F)...(1,F),(1,T),(2,F),(2,T)...

ประโยค

ต่อไปเราจะสร้างการวนซ้ำครั้งแรกของส่วนคำสั่งใหม่ มันประกอบไปด้วยแกดเจ็ตล้อมรอบด้วยกำแพง ภายในแกดเจ็ตเราวางหนึ่งตัวที่กึ่งกลางด้านบนและสองกำลังสองที่มุมด้านล่าง หนึ่งอันที่มุมล่างซ้ายและอีกอันที่มุมล่างขวา สี่เหลี่ยมจัตุรัสที่เหลือจะเป็นค่าที่แสดงถึงตัวแปรลวดของสายไฟสามเส้น ให้เราเรียกและเหล่านี้ จะถูกบังคับให้คู่กับหนึ่งในสายตัวแปรและที่เหลือลวดตัวแปรจะจับคู่กับค่า ภาพประกอบด้านล่างคำอธิบายจากซ้ายไปขวาF T2×3FTa,b,cFT

  • ซ้าย:การกำหนดค่าสำหรับการวนซ้ำครั้งแรกของ clause-gate ใหม่
  • ถูกต้องสามสถานะที่เป็นไปได้ของการปูกระเบื้องF

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

ทั้งสามรัฐนำไปสู่การเอียงสามที่เป็นไปได้ ภาพประกอบด้านล่างคำอธิบายจากซ้ายไปขวา

  • ซ้าย, บนสุด :ปูกระเบื้องซ้าย, ซ้าย, ล่าง:ปูกระเบื้องสี่เหลี่ยมที่เหลือF
  • กลางด้านบน :ปูกระเบื้องด้านขวากลางด้านล่าง:เรียงลำดับสี่เหลี่ยมที่เหลือF
  • ขวา, บนสุด :ปูกระเบื้อง, ล่าง, ขวา:ปูกระเบื้องสี่เหลี่ยมที่เหลือF

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

เนื่องจากจะถูกจับคู่กับหนึ่งในตัวแปรลวดในประโยค , ลวด - ตัวแปรนั้นไม่สามารถจับคู่กับในลวดอีกต่อไป; จึงบังคับให้ลวดเป็นจริง ในทางกลับกันตัวแปรลวดที่เหลือที่เรียงด้วยจะถูกบังคับให้เรียงต่อด้วยภายในสายของพวกเขา ตรงนี้เป็นข้อ จำกัด เช่นเดียวกับข้อFF TF1-in-3-SAT

หมายเหตุและเป็นตัวแปรลวด แต่พวกเขาแต่ละคนสามารถอ้างถึงหรือตัวแปรลวด; การใช้โดยหลักแล้วก็คือการปฏิเสธตัวแปรลวดa,b,cxxx

นอกจากนี้หนึ่งในการปลดภาระหน้าที่ในการทราบว่าสามารถถอดกระเบื้องใดออกจากชุดกระเบื้องได้เราต้อง "อนุประโยคและการทับซ้อน" ข้อ สิ่งที่ผมหมายถึงนี้คือการทำให้อีกแกดเจ็ตที่มีตัวแปรเพิ่มเติมตัวแทน negations ของและดาว} ให้เราเรียกและเหล่านี้ เหล่านี้จะต้องเป็นค่าเมื่อตะกี้ตัวแปรลวดและดาว} นี้แกดเจ็ตที่แตกต่างกันในการที่จะมีที่ศูนย์และสอง3×23a,b,ca,b,ca,b,c3×2TFค่าที่มุม; ตรงข้ามกับแกดเจ็ตประโยคที่อธิบายไว้จนถึง โดยการ "เพิ่ม" อนุประโยคเช่นนี้เราจะเพิ่มข้อ จำกัด เดียวกันกับแกดเจ็ตที่อธิบายไว้ข้างต้นอีกครั้ง อย่างไรก็ตามเรายังปล่อยชุดค่าผสมทั้งหมดของ จากชุดไพ่สำหรับแต่ละตัวแปร (และสำหรับและเช่นกันเพราะมันคือตัวแปรลวด) ภาพประกอบด้านล่างคำอธิบายจากซ้ายไปขวา(T,x),(T,x),(F,x),(F,x)a,b,c

  • ประโยค "double and contrapositive" ส่วนด้านล่างเป็นประโยคที่อธิบายไว้ข้างต้น ส่วนด้านบนเป็นส่วนคำสั่งที่อธิบายใหม่ ประโยคใหม่มีข้อ จำกัด เชิงตรรกะเหมือนกันทุกประการ มันเป็น contrapositive ของประโยคด้านล่าง อุปกรณ์เสริมที่รวมกันเหล่านี้และการปล่อยลวดทั้งหมดของจากชุดไพ่สำหรับแต่ละตัวแปรลวดที่เข้าร่วมในข้อ(T,x),(F,x),(T,x),(F,x)
  • เส้นสีน้ำเงินที่อยู่ตรงกลางของรูปซ้ายสุดจะอยู่ที่นั่นเพื่อความสะดวกในการดู ในความเป็นจริงมันสามารถลบออกได้โดยไม่อนุญาตให้มีสถานะใด ๆ เพิ่มเติม

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

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

  • รูปของ wire ที่เข้าร่วมใน clause เดียว สถานะถูกเลือกสำหรับส่วนคำสั่ง ที่นี่เราใช้ในขณะที่และแทนค่าสายอื่น ๆ ในข้อนี้1=bab
  • สำหรับรัฐที่กำหนดในข้อที่ค่าถูกบังคับให้ต้องจับคู่กับเพื่อนบ้านT1T
  • สิ่งนี้ทำให้ลวดถูกบังคับให้เป็นค่าจริง (คุณสามารถบอกได้ว่าตัวแปรบวกของสายถูกบังคับให้จับคู่กับและตัวแปรลบจะถูกบังคับให้จับคู่กับดังที่อธิบายไว้ข้างต้น )TF
  • สิ่งนี้บังคับให้อยู่ในส่วนคำสั่ง contrapositive (ส่วนบนของประโยค) เพื่อจับคู่กับภายในส่วนคำสั่ง ตอนนี้ถ้าคุณดูที่ wire ทุกไทล์ที่อยู่ใน wire นั้นจะรับประกันว่าจะถูกปล่อยออกมา: ไม่ว่าจะปล่อยออกมาใน wire หรือใน clause-gadget ในรัฐนี้เรามีแผ่นกระเบื้อง , , , , ,และT)1T(A,A)(A,T)(A,F)(1,T)(1,F)(1,F)(1,T)

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

ลองรัฐอื่นเราได้ภาพประกอบด้านล่างคำอธิบายจากซ้ายไปขวา

  • ส่วนคำสั่งอยู่ในอีกสถานะหนึ่งเรียงต่อกันในหนึ่งในสองวิธี(1,T
  • ดังนั้นถูกบังคับบนสาย(1,F
  • นำส่วนที่เหลือของลวดไปที่แผ่นกระเบื้องตามลำดับและให้ค่าลวดเป็นเท็จ
  • ในที่สุดในส่วนของอนุประโยค / เบ็ดเตล็ดต้องเรียงลำดับเนื่องจากอยู่ใน ลวด ในรัฐนี้เรามีแผ่นกระเบื้อง , , , , ,และT) เหล่านี้เป็นกระเบื้องเดียวกันที่ปล่อยออกมาในขณะที่รัฐอื่น(1,F)(1,T)(A,A)(A,T)(A,F)(1,T)(1,F)(1,F)(1,T)

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

ดังนั้นในรัฐใดรัฐหนึ่งเราปล่อยกระเบื้องเดียวกัน ดังนั้นสายและส่วนคำสั่งรวมกันประสบความสำเร็จในการปล่อยกระเบื้องเฉพาะถ้ามีการมอบหมายที่น่าพอใจ

แกดเจ็ตนี้ถูกปิดดังนั้นจึงไม่มีปัญหาเรื่องการไหล clause-gadget พร้อมกับ wire gadgetรับประกันว่าจะปล่อยค่าไทล์คู่เดียวกันเสมอและทำให้เราสามารถปลดปล่อยสิ่งเหล่านี้ได้แม้ว่าเราจะไม่รู้ว่ามันจะเรียงต่อกันอย่างไร

ตอนนี้แกดเจ็ตของเราทั้งหมดเป็นไปตามเกณฑ์

การกำหนด

ในการกำหนดขั้นสุดท้ายของเราเราสร้างอุปกรณ์สามแถวแต่ละอันคั่นด้วยกำแพงแนวนอน

  • ที่ด้านล่างเราวางเครื่องมือบังคับซึ่งเป็นสองแผ่นสูง เราจำเป็นต้องมีแกดเจ็ตบังคับสำหรับการสร้างบล็อกและสำหรับการรวมกันของและF เราวางแกดเจ็ตที่บังคับให้ติดกันโดยตรงTF
  • ในแถวกลางเราวางแกดเจ็ตลวดในแนวนอนซึ่งมีความสูงสองแผ่น แกดเจ็ตสายควรแยกออกจากกันด้วยกำแพงแนวตั้ง
  • ในแถวบนสุดเราวางประโยคเบ็ดเตล็ดซึ่งมีความสูงสี่แผ่น แกดเจ็ตประโยคควรแยกออกจากกันโดยผนังแนวตั้ง

ภาพประกอบปฏิบัติตามคำอธิบายด้านบนแต่ละรูป คลิกที่ภาพเพื่อความละเอียดเต็ม ซอร์สโค้ดสำหรับสร้างซ้ำ / สร้างอิมเมจแสดงอยู่ที่ด้านล่างของหน้า

การใช้สูตรเป็นตัวอย่างที่น่าพอใจ โซลูชันในฐานะพยานΦ(x)=(x1,¬x2,x3)(x2,¬x3,x4)(x1,x2,¬x4)(¬x1,x2,x3,¬x4)

ก่อนอื่นเราเริ่มด้วยผนังแนวนอนเพื่อแยกแถวของแกดเจ็ต เราแสดงสี่เหลี่ยมและคู่ที่ถูกบังคับให้ติดกระเบื้องภายในกำแพง

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

ต่อไปเราจะแสดงแกดเจ็ต โครงร่างสีน้ำเงินแสดงถึงเส้นขอบของแกดเจ็ต เส้นประสีฟ้าสำหรับอุปกรณ์บังคับใช้เนื่องจากจะไม่ถูกล้อมรอบด้วยกำแพง โปรดสังเกตว่าบรรทัดที่อยู่ตรงกลางของส่วนคำสั่งเบ็ดเตล็ดนั้นไม่ล้อมรอบด้วยกำแพง มันอยู่ที่นั่นเพื่อความสะดวกในการดู; การถอดสายไม่อนุญาตให้มีสถานะใด ๆ เกิดขึ้นอีกในประโยคตามที่อธิบายไว้ข้างต้น แต่เราแสดงเส้นสีน้ำเงินสำหรับการสาธิตนี้ หมายเหตุ:เราใช้ชื่อแบบเหลี่ยมเพื่อให้สามารถอ่านค่า semantic ได้เมื่อมีการใช้ แต่ละชื่อแสดงถึงค่าตัวเลข

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

ที่นี่เราเติมในผนังแนวตั้ง

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

ที่นี่เรากรอกคำตอบของพยาน; นั่นคือนี่เป็นวิธีการปูกระเบื้องถ้าใช้โซลูชัน SAT เพื่อสร้างมันขึ้นมา

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

ต่อไปเราจะเรียงแผ่นฟิลเลอร์ - พื้นที่ ส่วนที่เหลือของคณะกรรมการมีขนาดใหญ่เท่าที่จำเป็นสำหรับขนาดใหญ่เป็นจะต้องกระเบื้องป่านนี้ ดังนั้นเราจึงปล่อยคู่ที่เหลือในชุดไพ่ เส้นประที่นี่แสดงถึงการเรียงต่อกันที่ถูกต้อง แต่ไม่บังคับ อาจมีวิธีอื่นในการปูกระเบื้องเหล่านี้ ที่นี่เราแสดงมุมซ้ายล่างn

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

ที่นี่เราเติมเต็มสี่เหลี่ยมที่เหลือด้วยการเรียงต่อกันที่ถูกต้องเล็กน้อย

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

ที่นี่เราแสดงมุมขวาล่างของตาราง

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

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

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

และในที่สุดมุมบนซ้าย

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

การสร้างเกมกระดานทั้งหมดในครั้งเดียวผ่าน TeX ล้มเหลวโดยมีข้อผิดพลาดออกจากหน่วยความจำจาก pdflatex ดังนั้นหากคุณต้องการดูคุณจะต้องสร้างคลิปและปะเข้าด้วยกัน ให้แน่ใจว่าได้ตรวจสอบผู้ชมโน๊ตบุ๊ค


แหล่ง TikZ

ตัวกำเนิดเกม:

  • graphtex.py

    แปลง TeX เป็น svg โดยใช้ pdflatex, pdfcairo (poppler) และ rsvg-convert (libsvg)

  • dominosa.py

    มีตรรกะการแปลงการตรวจสอบวิธีแก้ปัญหาเกมและตรรกะการวาด

  • dominosa_demo.py

    การสาธิตการปฏิบัติการที่สร้างภาพที่ใช้ในคำตอบข้างต้น ดัมพ์อิมเมจไปที่ไดเร็กทอรีการทำงานปัจจุบัน

  • dominosa_demo.ipynb

    การสาธิต ipython ที่สร้างภาพที่ใช้ในคำตอบข้างต้น


1
นี่เป็น spactacular ขอบคุณมาก ..
Yoav bar sinai

2
โปรดบอกฉันว่าคุณมีเวอร์ชั่นของ arXiv มันอาจจะเป็นที่เหมาะสมมากขึ้นสำหรับแพลตฟอร์มนี้จะรวมร่างหยาบและเชื่อมโยงไปยังกระดาษเต็ม
ราฟาเอล

22

DOMINOSAคือ NP-hard


การเล่นเกมเป็นปัญหาการเพิ่มประสิทธิภาพ ค้นหาโดมิโนที่ถูกต้องปูกระเบื้องดังกล่าวซึ่งจะครอบคลุมสี่เหลี่ยมทั้งหมด เวอร์ชันการตัดสินใจของปัญหานี้คือ:

มีการปูกระเบื้องที่สมบูรณ์แบบครอบคลุมที่กำหนดตารางที่มีกระเบื้องที่ไม่ซ้ำกัน?(n+1)×(n+2)n

เห็นได้ชัดว่าปัญหาการปรับให้เหมาะสมปัญหาของการหาทางออกให้กับเกมอย่างน้อยก็ยากหรือยากกว่าปัญหาการตัดสินใจ

เราจะแปลงเป็นตารางที่สอดคล้องกันซึ่งจะครอบคลุมได้ถ้ามีการมอบหมายที่น่าพอใจให้กับสูตรเท่านั้น นอกจากนี้การครอบคลุมสามารถใช้จริงในการกู้คืนการมอบหมายที่น่าพอใจ1-3-in-SAT

ดังนั้นหากการก่อสร้างที่นำเสนอมีความถูกต้องและเป็นหนึ่งสามารถแก้เกมในเวลาพหุนามบนDTMแล้วมันจะบ่งบอกถึงNP} นี่หมายถึงคือ NP-hardP=NPDOMINOSA

ลดจากเป็น1-3-in-SATDOMINOSA

บทนำ

ส่วนใหญ่ของปัญหา / สายพันธุ์มีดีจดหมายสวยขนาดเล็ก}} การคิดปัญหาเป็นเรื่องสำคัญ ในขณะที่พวกเขามีความสัมพันธ์ซึ่งกันและกันเกือบทุกปัญหาในปัญหาเดียวสามารถเกี่ยวข้องกับในอื่น ๆ3-SATCIRCUITSAT

CIRCUITSATมีรูปแบบระนาบซึ่งมันจะลดลงเรียกว่าAT}} การแปลงนี้มีความสวยงามมากและโดยทั่วไปจะช่วยให้คุณสามารถฝังภาพถ่ายลงบนพื้นค้นหาสายไฟที่เหลือและใช้ "แกดเจ็ต" เพื่อให้สายข้ามผ่าน "ประตู" ของภาพถ่าย (คอลเลกชันของอุปกรณ์ด้วยสายอินพุตและเอาต์พุต) .PLANAR-CIRCUITSAT

สิ่งอำนวยความสะดวกส่วนใหญ่ของสายพันธุ์ยังมีการลดลงของสายพันธุ์ภาพถ่ายซึ่งขนานและเกี่ยวข้องกันมาก ลดได้อย่างง่ายดายจากที่หนึ่งไปยังอีกและง่ายต่อการเหตุผลเกี่ยวกับ ดังนั้นเมื่อใดก็ตามที่ฉันประสบปัญหาระนาบที่อาจเป็นปัญหายากฉันคิดว่าในแง่ของรูปแบบระนาบและแนวของพวกเขาในขนาดเล็ก}}3-SATPLANAR-CIRCUITSAT3-SATPLANAR-CIRCUITSAT

ตัวแปรระนาบมีความสำคัญที่ต้องรู้เพราะช่วยลดปัญหาระนาบ / เรขาคณิตเช่น Euclidean TSP (โดยบังเอิญการลดลงค่อนข้างหายากที่จะค้นหาและเรียนรู้) ดังนั้นจึงมีและ parellelเพื่อช่วยในการลดPLANAR-3-SATPLANAR-CIRCUITSAT

อีกสายพันธุ์สำคัญที่ต้องรู้เพราะบางคนอ่อนแอ นั่นคือดูเหมือนว่า "ง่ายขึ้น" แต่ก็ยังสมบูรณ์ NP พวกเขาดูเหมือนจะง่ายขึ้นที่จะแก้ปัญหาได้อย่างรวดเร็ว - และพวกเขาจะง่ายกว่า - แต่ยังคงเป็นปัญหา NP NP-complete แต่ง่ายกว่า; และง่ายต่อการลดในหลาย ๆ กรณี3-SAT

ตัวอย่างเช่นมีขนาดเล็ก}} สำหรับปัญหาบางอย่างคุณสามารถสร้างแกดเจ็ตได้อย่างง่ายดายในขณะที่สร้าง "อย่างน้อย 1 ใน 3" เช่นมาตรฐานการใช้จะไม่ชัดเจนและสร้างขึ้นเพื่อการก่อสร้างขนาดใหญ่1-in-3-SAT1-in-33-SAT

อีกตัวอย่างหนึ่งคือขนาดเล็ก}} เสียงโมโนทำให้สิ่งต่างๆง่ายขึ้นมากเมื่อคุณมีสิ่งก่อสร้างที่ไม่สามารถลบล้างค่าได้อย่างง่ายดายMONOTONE-1-in-3-SAT

ที่น่าตื่นตาตื่นใจยิ่งกว่านั้นคือมีรูปแบบระนาบ: ! ดังนั้นสิ่งนี้ทำให้ง่ายขึ้นมาก คุณไม่ต้องข้าม "สาย" (จำไว้ว่ามีแนวในกับสิ่งเหล่านี้) และเชื่อใจฉันในขณะที่อุปกรณ์เบ็ดเตล็ดกำลังสนุกพวกเขาทำ มักจะไม่ชัดเจนและยากมากMONOTONE-1-in-3-SATPLANAR-MONOTONE-1-in-3-SATCIRCUITSAT

PROBLEMMONOTONEPLANAR1-in-3NP-hard3-SATNoNoNoYesMONOTONE-3-SATYesNoNoNo1PLANAR-3-SATNoYesNoYes21-in-3-SATNoNoYesYes3PLANAR1-in-3-SATNoYesYesYes4MONOTONE-1-in-3-SATYesNoYesYes5PLANAR-MONOTONE-3-SATYesYesNoYes!6PLANAR-MONOTONE-1-in-3-SATYesYesYesYes7
  1. กำจัดตัวอักษรที่บริสุทธิ์
  2. ทฤษฎีบทการแบ่งขั้วของ Schaefer
  3. ปัญหาของผู้แทนที่เข้ากันได้
  4. การคำนวณน้ำหนักขั้นต่ำคือ NP-Hard
  5. ทฤษฎีบทการแบ่งขั้วของ Schaefer
  6. การค้นหาพาร์ติชันอัตโนมัติที่สมบูรณ์แบบนั้นยากมาก
  7. พาร์ทิชันอวกาศไบนารีที่เหมาะสมที่สุดในระนาบ

วิธีหนึ่งในการเริ่มต้นด้วยการย่อขนาดคือพยายามค้นหา "แกดเจ็ต" ที่มีลักษณะคล้ายกับสายไฟและแกดเจ็ตที่มีลักษณะคล้ายกับส่วนหนึ่งของหลากหลาย เป็นโบนัสตัวแปรหลายชนิดเป็นระนาบเราอาจหนีได้โดยไม่ต้องข้ามสาย3-SAT

"แกดเจ็ต" คืออะไร แกดเจ็ตคือสิ่งก่อสร้างที่เป็นปัญหาซึ่งเป็นประโยชน์ในการสร้างบล็อคเพื่อสร้างเกต / สาย / ส่วนคำสั่ง แกดเจ็ตบางตัวจะมีชุดสถานะที่ จำกัด ตัวอย่างเช่นแกดเจ็ตที่มีสองสถานะสามารถใช้เป็นตัวแปรได้ สถานะหนึ่งคือ "จริง" และอื่น ๆ เป็น "เท็จ" แกดเจ็ตที่มีสองสถานะซึ่งอาจเป็น "ยาว" สามารถโค้งงอและแยกได้มีประโยชน์ในฐานะที่เป็นสายเชื่อมต่อหากสามารถโต้ตอบกับตัวแปรได้และกลายเป็นข้อ จำกัด ในการขยายสถานะของตัวแปรไปยังตำแหน่งอื่น แกดเจ็ตที่มีสามสถานะสามารถใช้เป็นประโยคได้ ถ้ามันสามารถใช้เพื่อ จำกัด "หนึ่งในสาม" สายผ่านแต่ละรัฐหนึ่งในสามของมัน ในทำนองเดียวกันหนึ่งอาจต้องการประตูตรรกะทุกประเภทเช่นไม่ใช่แกดเจ็ต, หรือแกดเจ็ต, xor-gadget ฯลฯ ;

บล็อกอาคาร

  • ก่อนอื่นเราขอสงวนตัวเลขตัวอย่างเช่นบนกระดาน เราจะสร้างเป็นบล็อคสำหรับทุกอย่างอื่น11
  • เราจะใช้มุมหนึ่งเพื่อให้แน่ใจว่าไม่สามารถเชื่อมต่อกับอีกยกเว้นในมุมนี้ที่ซึ่งมันจะต้อง11
  • ด้านล่าง (ในสามร่าง) คือมุมและวิธีที่เราวาง s ที่นั่น1
  • เราจะใช้เพื่อระบุค่าที่ไม่ซ้ำในตารางทั้งหมดในไดอะแกรมทั้งหมด
  • ในความเป็นจริงเราจะครอบคลุมกริดของเราด้วยค่าก่อนที่จะทำการซ้อนทับค่าที่สำคัญ ดังนั้นโดยค่าเริ่มต้นจะครอบคลุมทุกอย่างด้วยค่า

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

ในขณะที่คุณสามารถมองเห็นโดยการวาง s คู่จะต้องถูกนำมาใช้ในการกำหนดค่านี้; มันจะต้องใช้หนึ่งในกระเบื้องประ ตอนนี้ไม่เคยเกิดขึ้นที่อื่นในกระดานซึ่งเป็นสิ่งที่เราต้องการ3   1(1,1) (1,1)

มีทางเลือกในการสำรองหมายเลขไม่ว่าจะเป็นกับกำแพงที่มีคนหรือตรงกลางไม่มีที่ไหนเลยมีคนที่อยู่ในกางเขน ไม่ว่าจะด้วยวิธีใดก็ตามตราบใดที่ถูกบังคับ45(1,1)

ผนัง

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

ภาพด้านล่างจากซ้ายไปขวา:

  1. สายคู่วิ1
  2. เฉพาะปูกระเบื้องที่เป็นไปได้ของ -square1
  3. เฉพาะที่เป็นไปได้ปูกระเบื้อง (เกือบ) ทั้งหมด s ในบรรทัด1
  4. เส้นกำแพงวาดเพื่อเน้น

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

ความพยายามเริ่มต้นที่สาย

ตอนนี้ด้วยการวาง "กำแพง" สองอันไว้ตรงข้ามกันและเว้นช่องว่างไว้ระหว่างกำแพงบางทีเราอาจจะสร้างอุปกรณ์คล้าย ๆ "สาย"1

แสดงเฉพาะเส้นขอบกำแพงนี่คือสิ่งที่เราได้รับในรูปด้านล่าง (จากซ้ายไปขวา):

  • วางสองกำแพงตรงข้ามกัน
  • ใส่หมายเลขที่ไม่ซ้ำกันภายใน
  • ขวาสุดที่สอง:สองสถานะที่เป็นไปได้ของลวด

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

มันทำงานอย่างไร:

ไม่มีรูใด ๆ ในท่อ / สายดังนั้นหากกระเบื้องเลื่อนขึ้นแล้วพวกเขาทั้งหมดจะต้องเลื่อนขึ้นตลอดแนวท่อ หากเลื่อนลงมันจะ "ดูด" ลงทั้งหมด ดังนั้นเราสามารถส่ง "สัญญาณ" จากด้านหนึ่งของสายไปยังอีกด้านหนึ่ง; กล่าวอีกนัยหนึ่งการเผยแพร่ค่า

ดังนั้นตอนนี้เราสามารถเผยแพร่ค่าในระยะทางไกล!

ข้อ จำกัด ที่เหลืออยู่คือ:

  • เราไม่สามารถดัดลวดได้
  • เราไม่สามารถแยกลวด
  • เราไม่สามารถข้ามสายได้
  • เราอาจมีปัญหารูปแบบที่น่ารำคาญเพราะเราต้องระมัดระวังเกี่ยวกับความเท่าเทียมกันของความยาวสายไฟ

การดัดลวดตอนที่ 1: กำแพงด้านล่าง

ปัญหาต่อไปคือเราต้องสามารถดัดโค้งได้ไม่ใช่แค่ไปตรง ...

ดังนั้น. เราจะแยกส่วนดัดออกเป็นสองส่วน ส่วนบนและส่วนล่าง ก่อนส่วนล่าง ไม่สนใจส่วนบนของโค้งเราจะทำในภายหลัง

ตัวเลขด้านล่างแสดงปัญหาเล็กน้อยเกี่ยวกับการโค้งงอ ด้านบนของเส้นลวดเป็น "หลวม" ดูเหมือนว่าจะทำให้กำแพงที่มีความคมชัดเป็น 90 องศาได้ยาก

จากซ้ายไปขวา:

  • ด้านบนของเส้นลวดคือ "หลวม"
  • จะเกิดอะไรขึ้นถ้าเราพยายามงอมัน เราต้องการโยงให้อยู่ระหว่างเส้นสีฟ้า อีกครั้งไม่สนใจส่วนบนของโค้งเราจะทำในภายหลัง
  • อย่างที่คุณเห็นด้านบน s หลวมพวกมันสามารถเรียงต่อกันตามผนังหรือผ่านทางลวด ! มันไม่ดีเลย1

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

ทางออกหนึ่งมีดังนี้:

  • เลือกคู่ใกล้กับโค้ง รับค่าของ square ให้เราตั้งชื่อ ; ที่นี้หมายถึงหมายเลขที่ไม่ซ้ำกันในตารางทั้งหมดเช่นเดียวกับและถูกนำกลับมาใช้ครั้งเดียวที่นี่ในโค้งนี้เท่านั้น เนื่องจากนี้จับคู่กับจึงไม่สามารถจับคู่กับอีกครั้ง ดังนั้นเราจึงวางมันขวาบนขวาสุดจอม1 ตอนนี้เราสามารถเห็นได้อย่างชัดเจนตัวเลือกเดียวที่เหลือสำหรับการจับคู่คือด้านขวาของมันและดังนั้นมันจะแข็งกำแพง(x,1)xqx1111

ภาพประกอบด้านล่างคำอธิบายจากซ้ายไปขวา:

  • สถานการณ์ที่มีปัญหา
  • เลือกสี่เหลี่ยมให้เป็นค่าสแควร์ของสี่เหลี่ยมจัตุรัสใด ๆ ในส่วนโค้ง (แน่นอนว่าไม่ใช่ sq1
  • ทั้งสองสลับจากด้านบน - ขวาสุดเอียง; ครั้งนี้มีเพียงหนึ่งในนั้นเท่านั้นที่ถูกต้อง1

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

อย่างไรก็ตามเราจะมั่นใจได้อย่างไรว่าจะไม่ทำลายลวด ด้านล่างคุณจะเห็นสถานะของเส้นลวดและจะไม่ขัดขวางมันqq

จากซ้ายไปขวา:

  • การก่อสร้างปัจจุบัน
  • ร่างที่ถูกต้องสองคน:สถานะของเส้นลวด; สังเกตุพวกเขาจะไม่ขัดขวางโดยการแนะนำของดาว}}q

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

ตอนนี้เรายังมีอยู่ด้านบน ซ้ายสุด-topmost-111

เราจะทำสิ่งเดียวกัน เลือกคู่ที่มีการจับคู่แล้วในแผ่นโค้งและวางที่ด้านบนสุดของซ้ายสุด - สุด - .(r,1)r1

ภาพประกอบด้านล่างจากซ้ายไปขวา:

  • การก่อสร้างในปัจจุบันของเรา
  • ปัญหา: leftmost-topmost-สามารถจับคู่กับตัวเลขในลวดหรือกับกำแพง เราต้องการให้มันเพียงจับคู่กับผนัง1
  • เลือกและการใช้หมายเลขเดียวกันบนซ้ายสุด-topmost-1r1

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

และในที่สุดเราก็ถึงโค้งล่างของเรา ภาพประกอบด้านล่างคำอธิบายจากซ้ายไปขวา:

  • ซ้าย: การก่อสร้างขั้นสุดท้ายของเราสำหรับการโค้งงอ
  • ขวา:วิธีการต่อสายไปทางซ้าย

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

การดัดลวดส่วนที่ 2: กำแพงด้านบน

ผนังที่ทำมุมบนของโค้งงอนั้นง่ายกว่ามาก คุณสามารถจัดแนวกำแพงแนวตั้งกับผนังแนวนอนได้ง่ายๆ ภาพประกอบด้านล่างคำอธิบายจากซ้ายไปขวา:

  • ลวดดัดที่เราต้องการทำ
  • วางส่วนแนวตั้งของกำแพงสี่เหลี่ยมลง
  • ปูกระเบื้องสี่เหลี่ยมของผนังแนวตั้ง
  • การจัดวางและปูกระเบื้องผนังแนวนอน มันสามารถพบกับผนังแนวตั้งและมุม

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

ตอนนี้คุณควรมั่นใจแล้วว่าเราสามารถวางและงอสายไฟได้ เรายังไม่สามารถแยกหรือต่อสายไขว้ได้

ข้อ จำกัด ที่เหลืออยู่คือ:

  • เราไม่สามารถดัดลวดได้
  • เราไม่สามารถแยกลวด
  • เราไม่สามารถข้ามสายได้
  • เราอาจมีปัญหารูปแบบที่น่ารำคาญเพราะเราต้องระมัดระวังเกี่ยวกับความเท่าเทียมกันของความยาวสายไฟ

ลวดที่มีมูลค่า

ตอนนี้เรามีสายไฟมันคงจะดีถ้ามีลวดที่มีค่าซึ่งเราสามารถเห็นค่าของสายได้เช่น LED บนแผงวงจร ดังนั้นสิ่งที่เราทำคือเอาลวดพูดถึงความยาวและแนะนำชื่อ square เราจะเรียกมันว่าและอีกสี่เหลี่ยมชื่อเราจะเรียกมันว่าดาว} สิ่งเหล่านี้มีทั้งที่ไม่เหมือนกันในแต่ละส่วนของเส้นลวดที่มีค่าเช่น เพียงสองครั้งและพวกเขาจะได้รับกลับมาใช้เฉพาะภายในเดียวลวดมูลค่า พวกมันจะถูกวางเป็นคู่สี่เหลี่ยมสองตัวถัดจากกันและกันและสองสี่เหลี่ยมถัดจากกันและกันด้วยเดียว7TFTFกำลังแยกพวกมันออก ภาพประกอบด้านล่างคำอธิบายจากซ้ายไปขวา:

  • ซ้าย:ลวด
  • ขวา:การกำหนดค่าสี่เหลี่ยม

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

แล้วเราจะบอกได้อย่างไรว่าสายเป็นจริงหรือเท็จ? เส้นลวดมีสองสถานะ ในแต่ละรัฐเหล่านี้หนึ่งในหรือจะถูกจับคู่ในแผ่นเดียวกัน ค่าที่จับคู่คือค่าของเส้นลวด ภาพประกอบด้านล่างกิจกรรมจากซ้ายไปขวา:TF

  • ซ้าย, ขวา:สองสถานะของเส้นลวดที่มีค่า ;
  • ซ้าย:ลวดมีมูลค่า trued เนื่องจากกำลังสองแบ่งเป็นแผ่นเดียวT
  • ด้านขวา: เส้นลวดมีค่าเป็น false เนื่องจากสี่เหลี่ยมใช้แผ่นเดียวF

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

ตอนนี้เราสามารถตั้งชื่อตัวแปรที่เราสามารถใช้เพื่อวางตัวแปรลงบนกริด เราสามารถเชื่อมต่อสายที่มีค่าสองเส้นและบังคับให้พวกเขามีค่าเท่ากันหรือถ้าเราเชื่อมต่อพวกเขาด้วยความยาวคี่ให้บังคับพวกเขาให้มีค่าต่างกัน และใช้สายไฟเราสามารถทำสิ่งนี้ทางไกลข้ามกริด การใช้สายไฟทำให้เราสามารถเผยแพร่ค่าของตัวแปรที่ตั้งชื่อไว้ทั่วทุกที่3-SAT

ข้อ จำกัด ที่เหลืออยู่คือ:

  • เราไม่สามารถแยกลวด
  • เราไม่สามารถข้ามสายได้
  • เราอาจมีปัญหารูปแบบที่น่ารำคาญเพราะเราต้องระมัดระวังเกี่ยวกับความเท่าเทียมกันของความยาวสายไฟ

ไม่ได้ประตู

ไม่ได้ประตูที่ไม่จำเป็นมันเป็นนัย: เพียงแค่ใช้ความยาวลวดปิดโดยหนึ่งเราสามารถลบล้างค่าของลวด

ประตูข้อ

ตอนนี้ฉันสามารถสาธิตแกดเจ็ตประโยคอย่างง่าย; มันจะเชื่อมต่อกับสายไฟเส้นและบังคับให้หนึ่งในนั้นเป็นสถานะ "ถูกดึง" และบังคับให้อีกสองสายอยู่ในสถานะ "ดัน" เราสามารถใช้นี่เป็นความสัมพันธ์แบบหนึ่งในสามอย่างแน่นอน เราตั้งค่าสถานะคี่ - ลวดให้เป็น "จริง" และอีกสองรัฐ - ลวดหมายถึง "เท็จ" และเราถูกตั้งค่า3

ภาพประกอบด้านล่างคำอธิบายจากซ้ายไปขวา:

  • โครงร่างลวดของ gadget ส่วนคำสั่ง มันทำให้เครื่องหมาย "บวก"; การรวมสาย 3 เส้นในที่เดียว
  • เติมลวดด้วยสี่เหลี่ยม
  • สามรัฐของจัตุรัสกลาง แต่ละรัฐเหล่านี้ "ดึง" หนึ่งสายตรงเข้าไปในศูนย์จุดสำคัญของประตู; ที่จะทำหน้าที่เหมือนข้อ1-in-3-SAT

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

ทีนี้ลองดูที่สถานะต่างกัน ภาพประกอบด้านล่างคำอธิบายจากซ้ายไปขวา:

  • ลวดด้านซ้ายจะถูกดึงเข้าสู่ศูนย์กลาง อีกสองคนถูกผลักออกไป
  • ลวดด้านล่างถูกดึงเข้าไปในศูนย์; อีกสองคนถูกผลักออกไป
  • ลวดด้านล่างขวาถูกดึงเข้าสู่ศูนย์กลาง อีกสองคนถูกผลักออกไป

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

ทีนี้ถ้าคุณต่อสายที่มีความยาว - ขวา (หรือยาวคี่) ไปยังจุดสิ้นสุดของประตูนี้มีเพียงหนึ่งในนั้นเท่านั้นที่สามารถเป็นจริงได้อีกสองสายที่ผิด (ขึ้นอยู่กับว่าคุณแนบสายคี่ผิดปกติ บิต). ดังนั้นเราสามารถเชื่อมต่อค่าลงใน CNF clause31-in-3

ข้อ จำกัด ที่เหลืออยู่คือ:

  • เราไม่สามารถแยกลวด
  • เราไม่สามารถข้ามสายได้
  • เราอาจมีปัญหารูปแบบที่น่ารำคาญเพราะเราต้องระมัดระวังเกี่ยวกับความเท่าเทียมกันของความยาวสายไฟ

แยกลวด

ในการแยกสายเราต้องต่อสายสองเส้นไว้ข้างกัน ต่อไปในฐานะเครื่องช่วยการมองเห็นเราติดป้ายกำกับสายไฟแต่ละเส้นด้วยสองช่องสี่เหลี่ยมสิ่งนี้จะช่วยให้เราเห็นเมื่อลวดเป็น "จริง": เมื่อทั้งสองสแควร์สของลวดในกระเบื้องเดียวแล้วมันจะเป็นจริงมิฉะนั้นเท็จ แต่ละสายควรจะได้รับของตัวเองคู่ของคู่ดังนั้นเราจะตั้งชื่อหนึ่งคู่และอื่น ๆดาว} จากนั้นเราจะแนะนำค่าที่ไม่ซ้ำชื่อใหม่สามค่าคือTTTT1T2a,b,c. เราจะวางทั้งสามนี้ไว้ติดกันอีกครั้งหนึ่งบนเส้นลวดแต่ละเส้น อย่างไรก็ตามเมื่อวันที่หนึ่งลวดให้เป็นหนึ่งเดียวสี่เหลี่ยมระหว่างสี่เหลี่ยมและคู่ อีกด้านหนึ่งให้ใส่สองช่องระหว่าง squaresa,b,cTa,b,c

ภาพประกอบด้านล่างคำอธิบายจากซ้ายไปขวา:

  • โครงร่างลวด โปรดสังเกตว่าผนังนั้นหนาเล็กน้อยดังนั้นสายไฟจึงถูกดึงเข้าหากันเพื่อใช้เป็นภาพประกอบ ในความเป็นจริงพวกเขาอยู่ห่างกันเล็กน้อย
  • ค่าสแควร์; ค่าอยู่ด้านบนและตัวเชื่อมต่อแบบแยกส่วนด้านล่างTa,b,c

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

สิ่งนี้ทำคือบังคับสายไม่ให้แตกต่าง หากปูกระเบื้องบนเส้นลวดหนึ่งเส้นลวดที่สองจะไม่สามารถแยกออกทีละสายได้เพราะนั่นจะแปลว่าเป็นกระเบื้องบน สายที่สองและดังนั้นจะถูกเรียงสองครั้ง ภาพประกอบด้านล่างคำอธิบายจากซ้ายไปขวา:a,ba,ba,b

  • ตัวอย่างสถานะของเส้นลวดด้านซ้ายมีค่าเป็นจริง
  • สถานะไม่ดีของสายที่สอง มันพยายามที่จะมีคุณค่าแตกต่างกัน แต่จากนั้นจะได้รับคู่ที่ซ้ำกัน
  • สถานะที่ดีของสายที่สองตอนนี้พวกเขามีค่าเท่ากันและไม่มีคู่ที่ซ้ำกัน

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

หากคุณเล่นกับอีกสองรัฐที่เป็นไปได้คุณจะเห็นว่าสิ่งนี้ขยายไปถึงรัฐเหล่านั้นเช่นกันและมันทำงานได้ทั้งสองวิธี ดังนั้นสายทั้งสองนี้จึงเหมือนกัน เราแยกลวดสำเร็จแล้ว เราสามารถแบ่งสายได้หลายครั้งเท่าที่เราต้องการแต่ละครั้งใช้ชุดใหม่a,b,c

ข้อ จำกัด ที่เหลืออยู่คือ:

  • เราไม่สามารถแยกลวด
  • เราไม่สามารถข้ามสายได้
  • เราอาจมีปัญหารูปแบบที่น่ารำคาญเพราะเราต้องระมัดระวังเกี่ยวกับความเท่าเทียมกันของความยาวสายไฟ

ลวดไร้สาย!

เพื่อความสุขของฉันการแยกสายกลายเป็นไร้สาย! นั่นคือในภาพประกอบด้านบนฉันวางสายไฟไว้ข้าง ๆ กัน แต่ไม่มีเหตุผล! เราสามารถวางสายไฟที่ใดก็ได้บนกริดและพวกเขาจะยังคง "ยุ่ง" เพื่อพูด สิ่งนี้ช่วยเราประหยัดปัญหามากมาย:

  • เราไม่ต้องกังวลเกี่ยวกับการข้ามสาย สิ่งนี้ช่วยให้เราลดจากตัวแปรที่ไม่ใช่ภาพถ่ายของ3-SAT
  • เราต้องทำเลย์เอาต์ที่น่ารำคาญเอาสายไปยังสถานที่ของพวกเขามันเป็นเรื่องง่าย! เหมือนโทรศัพท์ไร้สาย! เสรีภาพ!
  • เราไม่ต้องกังวลเกี่ยวกับรูปแบบความเท่าเทียมกันของความยาวสายไฟ / การปิดแบบหนึ่งต่อหนึ่ง
  • เราสามารถลดขนาดให้เล็กสุดได้ ตัวแปรแต่ละตัวจะมีแถบเส้นลวดยาวชุดเดียวพร้อมการเชื่อมต่อแบบไร้สายจำนวนมากตามสาย การเชื่อมต่อเหล่านี้จะไปยังส่วนคำสั่งซึ่งจะอยู่ในตำแหน่งของตัวเองบนกริด ตอนนี้ส่วนของคำสั่งจะประกอบไปด้วยอุปกรณ์ข้อและสายไร้สายสามเส้นเท่านั้นที่ยื่นออกมา

ข้อ จำกัด ที่เหลืออยู่คือ:

  • เราไม่สามารถข้ามสายได้
  • เราอาจมีปัญหารูปแบบที่น่ารำคาญเพราะเราต้องระมัดระวังเกี่ยวกับความเท่าเทียมกันของความยาวสายไฟ

การลดความพยายามครั้งแรก

ปล่อยเป็นสูตรบูลีนΦ(x)=iCi1-in-3-SAT

  • สำหรับแต่ละให้วางสายยาวเส้นเดียวเป็นแถวใกล้กับด้านล่างของตารางxjx
  • สำหรับแต่ละทำข้อประตูด้านบนของตาราง; คุณสามารถจัดวางพวกมันได้ตามต้องการ ควรเติมให้เต็มในพื้นที่สี่เหลี่ยมจัตุรัส แต่คุณสามารถจัดเรียงมันเป็นแถวยาว ๆ ได้เช่นกันCiΦ(x)
  • สำหรับตัวแปรแต่ละตัวที่มีส่วนร่วมในข้อให้วางสายแบบไร้สายไว้ที่หนึ่งในสายพินของประตูส่วนคำสั่ง วางอีกของการเชื่อมต่อแต่ละครั้งลงในสาย / แถวตัวแปรที่สอดคล้องกัน เงื่อนไขที่ถูกทำให้ยุ่งเหยิงควรทำการเชื่อมต่อแบบไร้สายกับประโยคที่ห่างออกไปหนึ่งอันเปลี่ยนความยาวลวดความเท่าเทียมกันและลบล้างค่าxjCi3a,b,c

สิ่งที่อาจมีลักษณะ:

  • รูปภาพ:ส่วนเชื่อมต่อกับสายไร้สายโดยตรง "ฮอตสปอต" เป็นวิธีที่เราเป็นสัญลักษณ์ของจากที่นี่ไป ฮอตสปอตเหล่านี้แต่ละอันจะเชื่อมต่อกับตัวแปรในกริดa,b,c

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

และนี่คือสิ่งที่ตารางอาจมีลักษณะ:

  • รูป:กระดานเกมที่ได้ ตัวแปรจะเรียงกันเป็นแถวที่ด้านล่าง ส่วนคำสั่งนั้นแผ่ออกไปด้านบน เลย์เอาต์นี้จะทำให้เกิดการระเบิดเป็นกำลังสอง; รูปแบบที่ชาญฉลาดสามารถหลีกเลี่ยงการระเบิดเป็นกำลังสอง

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

รายละเอียดโอกาสสุดท้าย

ระลึกถึงปัญหาการตัดสินใจ:

มีการปูกระเบื้องที่สมบูรณ์แบบครอบคลุมที่กำหนดตารางที่มีกระเบื้องที่ไม่ซ้ำกัน?(n+1)×(n+2)n

ดังนั้นสำหรับตารางเราสามารถใช้เพียงตัวแปร แต่การลดลงของเราต้องใช้จำนวนมากของตัวแปรที่ไม่ซ้ำกันมากขึ้นกว่า(n) มีหลายวิธีในการแก้ไขปัญหานี้(n+1)×(n+2)nO(n)

  • วิธีหนึ่งคือการกำหนดขนาดของตารางในแกนทั้งสอง ดังนั้นตอนนี้ตารางเป็นเพียงซึ่งหมายถึง ทั้งหมดของตัวเลขที่ไม่ซ้ำกันของเราสามารถกระโดดจากnจากนั้นเราจะต้องเติมส่วนที่เหลือของตารางนำตัวเลขที่เป็นเอกลักษณ์ของเรากลับมาใช้ใหม่ แต่ระวังอย่างมากที่จะไม่วางตัวเลขใด ๆ ที่เราอยู่ติดกันในตารางของเราติดกับแต่ละอื่น ๆ ในฟิลเลอร์ - พื้นที่ที่เหลือ ของตาราง มีวิธีที่สร้างสรรค์มากมายในการทำเช่นนี้ฉันจะปล่อยให้เป็นแบบฝึกหัด วิธีนี้ทำให้เกิดการระเบิดกำลังสองเพิ่มเติมอย่างเห็นได้ชัดO(|x|×|Φ(x)|)O(n)n
  • อีกวิธีหนึ่งที่ซับซ้อนกว่าและซับซ้อนกว่าคือการกระจายบล็อก แทนที่จะเป็นเพียงหนึ่ง Building Block เราสามารถใช้ Building Block และจากนั้นเราสามารถนำตัวเลขที่พวกเขาจับคู่กลับมาใช้ใหม่ได้ วิธีนี้ช่วยให้เราหลีกเลี่ยงการระเบิดแบบสี่เหลี่ยมจัตุรัสO ( n )1O(n)

แหล่งกราฟ


ลดได้ดี! แค่อยากรู้: คุณจะพิสูจน์ได้อย่างไรว่าคู่ที่หายไป (หลังจากวางสายไฟติดผนัง - อุปกรณ์บนกระดาน) สามารถบรรจุ (ในเวลาพหุนาม) ลงในตารางสี่เหลี่ยม (n + 1) x (n + 2)? ฉันจำได้ว่ามีการลดลงคล้าย ๆ กัน แต่ไม่ได้คิดวิธีที่จะพิสูจน์ว่าคู่ "ไม่ได้ใช้" สามารถจัดเรียงในสี่เหลี่ยมผืนผ้า (อาจใหญ่กว่า) (กฎของเกมระบุว่ากระเบื้องทุกกับถูกนำมาใช้ในกระดาน dominosa ที่ถูกต้อง)a i , b i = 1 .. n[ai,bi]ai,bi=1..n
Vor

ฉันจะย้ายความคิดเห็นทั้งหมดเหล่านี้เป็นคำตอบของฉันและทำให้ครอบคลุมยิ่งขึ้นในการแก้ไขครั้งใหญ่ครั้งต่อไปของฉัน
Realz Slaw

ตกลงฉันจะรอมัน!
Vor

@ RealzSlaw ขอบคุณมาก! ฉันยังไม่มีเวลาอ่าน แต่มันก็ดูดีมาก
Yoav bar sinai

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