คุณสามารถเชื่อมต่อจุดต่างๆได้หรือไม่


18

ความท้าทายนี้มาจาก Flow Free สามารถดูเวอร์ชั่นออนไลน์ได้ที่นี่: http://www.moh97.us/

คุณจะได้รับจิ๊กซอว์และคุณจะต้องกลับมา1ถ้าปริศนาแก้ได้หรือ0ไม่

เพื่อแก้ไขปริศนาผู้เล่นจะต้องสร้างเส้นทางเพื่อเชื่อมต่อตัวเลขแต่ละคู่โดยใช้ทุกช่องว่างหนึ่งครั้ง

คุณถูกส่งผ่านในมิติของสี่เหลี่ยมจัตุรัสแล้ว x, y, c (โดยที่ c คือตัวเลขที่แทนสี) ของแต่ละจุด ตัวอย่างเช่น:

หาก5,5 0,0,0 3,0,1 1,1,2 1,2,2 4,2,1 4,4,0ถูกส่งถึงคุณมันจะเป็นตัวแทนของ:

0..1.
.2...
.2..1
....0

และควรกลับ 1


ปัญหาการทดสอบเพิ่มเติมมีดังนี้:

5,2 2,0,1 0,1,2 4,1,2 หมายถึง:

..1..
2...2

และไม่ได้เป็นแก้ปัญหาได้เพราะมีเพียง 11

4,2 0,0,0 3,0,0 0,1,0 3,1,0 หมายถึง:

0..0
0..0

และไม่สามารถแก้ไขได้เนื่องจากมีมากกว่า 2 0วิ

8,6 0,0,1 7,5,1 หมายถึง:

1.......
........
........
........
........
.......1

และไม่สามารถแก้ไขได้ (เนื่องจากคุณไม่สามารถใช้ทุกตาราง)

2,5 0,0,1 2,0,6 4,0,6 0,1,4 3,1,4 4,1,1 หมายถึง:

1.6.6
4..41

และไม่สามารถแก้ไขได้เนื่องจากคุณไม่สามารถเชื่อมต่อ 1s

6,3 1,0,4 5,0,1 0,1,4 1,1,3 5,1,3 0,2,2 3,2,2 5,2,1 หมายถึง:

.4...1
43...3
2..2.1

และไม่สามารถแก้ไขได้เนื่องจากคุณไม่สามารถเชื่อมต่อ 1s (หรือ 3s) ได้เนื่องจากทั้งสองพา ธ ต้องข้าม

5,2 0,0,1 3,0,1 0,1,3 4,1,1 หมายถึง:

1..1.
3...3

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

2,2 0,0,0 1,1,0 หมายถึง:

1.
.1

และไม่สามารถแก้ไขได้เพราะคุณไม่สามารถใช้กำลังสองทั้งหมดที่นี่

นี่คือการทดสอบเพิ่มเติม:

5,5 0,3,0 0,4,1 1,2,2 1,3,1 2,0,0 3,0,4 3,1,2 3,3,5 3,4,4 4,4,5 ควรกลับ 1

13,13 1,1,0 9,1,1 10,1,2 11,1,3 1,2,4 2,2,5 5,2,6 7,2,7 3,3,0 5,4,6 6,4,1 9,6,3 4,7,8 5,8,9 12,8,8 11,9,10 2,10,4 4,10,2 9,10,5 11,10,7 1,11,9 12,12,10 ควรกลับ 1

7,7 0,0,0 0,1,1 1,1,2 2,1,3 4,2,4 0,3,1 5,3,3 0,4,4 2,4,5 5,4,2 0,5,0 1,5,5 3,5,6 3,7,6 ควรกลับ 0


นี่คือรหัสกอล์ฟและใช้กฎมาตรฐาน


2
การแก้ปัญหาจะต้อง "สมจริง" ถูกต้องหรือถูกต้องตามหลักวิชาหรือไม่? ยกตัวอย่างเช่นพื้นที่ของรัฐสามารถแบ่งออกเป็นหนึ่งในการกำหนดค่าที่เป็นไปได้หนึ่งใน 6 การกำหนดค่าอินพุตต่อการอินพุตให้กับแต่ละเซลล์ว่าง ความสามารถในการละลายจะถูกกำหนดได้อย่างง่ายดายโดยการพยายามรวมกันทั้งหมด 6 ^ N และส่งคืน1หากหนึ่งในนั้นเข้าชมเซลล์ทั้งหมดและเชื่อมต่อเทอร์มินัลทั้งหมด เห็นได้ชัดว่าวิธีการนี้จะไม่เสร็จสมบูรณ์ภายในระยะเวลาที่เหมาะสมสำหรับสิ่งใด ๆ แต่มีขนาดเล็กที่สุดN(จำนวนเซลล์ว่างเปล่า) แต่เรายังคงมีการรับประกันทางคณิตศาสตร์ว่าในที่สุดอัลกอริทึมจะคืนค่าที่ถูกต้อง
COTO

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

1
@NathanMerrill: ปัญหานั้นลดลงเป็น SATและทำให้ NP ยาก
COTO

3
@NathanMerrill การลดปัญหาเป็น SAT หมายความว่าปัญหาอยู่ใน NP ไม่ใช่ว่าเป็น NP-hard - แต่ลด SAT เป็นปัญหาที่แสดงถึงความแข็งของปัญหา หน้าเว็บที่คุณเชื่อมโยงมีลิงก์ไปยังหลักฐานการพิสูจน์ความสมบูรณ์แบบของ NP
cardboard_box

1
@VisualMelon สี Digit เป็นคำที่ผิด แต่ละสีมีจำนวนที่แตกต่างกันไม่ใช่ตัวเลข
Nathan Merrill

คำตอบ:


3

Haskell

import Data.List.Split
import qualified Data.Sequence as Q
import Data.List
import Control.Monad

data A a = S a | E a | P a | X deriving Eq

sc = foldr1 (Q.><)
sp b x y p = Q.update y (Q.update x p $ b `Q.index` y) b
dt b c | S c `elem` sc b = E c
       | otherwise = S c
ad b [x, y, c] = sp b x y (dt b c)

ep b [x, y, c] = do
  let nps = filter ob [(x+1, y), (x-1, y), (x, y+1), (x, y-1)]
      ns = map gp nps
  [b | E c `elem` ns] ++ do
    (x', y') <- filter ((== X) . gp) nps
    ep (sp b x' y' (P c)) [x', y', c]
  where ob (u, v) = 0 <= u && u < length (b `Q.index` 0) && 0 <= v && v < length b
        gp (u, v) = b `Q.index` v `Q.index` u

rd i = let [c, r] : ps = (map read . splitOn ",") <$> words i :: [[Int]]
           e = Q.replicate r $ Q.replicate c X
           cs = map last ps
           ss = nubBy (\[_,_,c1] [_,_,c2] -> c1 == c2) ps
           b = foldl ad e ps
           bs = foldM ep b ss
       in if even (length cs) && length ss == length cs `div` 2 &&
             (all (\[j,k] -> j==k) . chunksOf 2 . sort $ cs) &&
             any (null . Q.elemIndicesL X . sc) bs
           then 1
           else 0

main = rd <$> getContents >>= print

สำคัญ

  • sc: Seq concat
  • sp: กำหนดตำแหน่ง
  • dt: ประเภทจุด (เช่นเริ่มต้นหรือสิ้นสุดบรรทัด)
  • โฆษณา: เพิ่มจุด
  • ep: ขยายเส้นทาง
  • rd: เรียกใช้จุด (อัลกอริทึมบริสุทธิ์หลัก)

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

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

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