จำนวนเขาวงกตที่ถูกต้อง


12

ให้WxHตารางเขาวงกตที่เป็นไปได้กี่ที่จะมี?

สิ่งที่คุณรู้เกี่ยวกับเขาวงกต:

  1. กริดเป็นHสี่เหลี่ยมจัตุรัสสูงและWกว้าง
  2. สี่เหลี่ยมจัตุรัสมีสามประเภท: เริ่มต้นเสร็จสิ้นและว่างเปล่า เขาวงกตของคุณจะต้องมี 1 Start และ 1 Finish อย่างแน่นอนและสี่เหลี่ยมที่เหลือทั้งหมดนั้นจะว่างเปล่า
  3. มีกำแพงล้อมรอบเขาวงกตทั้งหมด
  4. กำแพงสามารถอยู่บนขอบระหว่างสี่เหลี่ยมสองช่องใดก็ได้ยกเว้นว่ามันจะแตกกฎด้านล่าง:
  5. จะต้องมีเส้นทางจากช่องสี่เหลี่ยมเริ่มไปยังสี่เหลี่ยมเส้นชัย

ดังนั้นให้มีตัวเลขสองตัวWและHคุณจะต้องส่งกลับหมายเลขเดียวที่แสดงถึงจำนวนของการกำหนดค่าสี่เหลี่ยม / กำแพงที่เป็นไปได้ รับรองได้เลยว่าW*H > 1

ตัวอย่างเช่น2x2เขาวงกตมี100การกำหนดค่าที่เป็นไปได้ที่แตกต่างกันอย่างแน่นอน

นี่คือเพื่อให้คำตอบที่สั้นที่สุดชนะ!


มีข้อ จำกัด ด้านขนาดและ / หรือการใช้งานจริงหรือไม่? หากไม่มีใครพบอัลกอริทึมที่สามารถคำนวณการนับได้อย่างมีประสิทธิภาพ (ซึ่งดูยาก) ฉันคาดหวังว่าโซลูชันส่วนใหญ่จะมีรันไทม์แบบเอ็กซ์โปเนนเชียล หมายความว่าพวกมันจะระเบิดในขนาดที่พอเหมาะ
Reto Koradi

@RetoKoradi ไม่ไม่มีข้อ จำกัด ในการใช้งานจริง ฉันไม่แน่ใจว่าข้อ จำกัด จะทำให้ปัญหาเป็นไปไม่ได้หรือไม่
Nathan Merrill

คำตอบ:


3

Python 2, 329 310 ไบต์

from itertools import*
w,h=input()
R=range(w*h)
p=product
n=0
Z=[(x,y)for x,y in p(R,R)if abs(x%w-y%w)+abs(x/w-y/w)<2]
for s,f,W in p(R,R,p(*[((),z)for z in Z if z[0]<z[1]])):
 V={s};C=[s];v=0
 while C:
  c=C.pop();v|=c==f!=s;V|={c}
  for o,q in Z:C+=(c==o)*len({q,(o,q),(q,o)}-(V|set(W)))/3*[q] 
 n+=v
print n

นี่เป็นเวอร์ชันที่โปรแกรม golfed (และไม่มีประสิทธิภาพมากขึ้น) ที่ฉันใช้ขณะที่พูดถึงปัญหากับ @Nathan ฉันสามารถบันทึกไม่กี่ไบต์โดยแทนที่การเว้นวรรคบางส่วนด้วยแท็บ แต่ฉันจะบันทึกไว้ในภายหลัง

อัลกอริทึมนั้นสร้างเขาวงกตทุกตัวจากนั้นเติมน้ำท่วมตั้งแต่เริ่มต้นโดยดูว่าเราผ่านจุดสิ้นสุดในบางจุดหรือไม่

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