ìê¹ ìë ì í ë®ê°(XCC)륌 ì¶€ì¶ë ë§í¬ê° ìëëŒ í¬ëì€(Donald E. Knuth)ì í¬ì
ì§í© êž°ë² **"ì¶€ì¶ë 칞"**ìŒë¡ íŒë€. ìŽ ì ì¥ìë
sjnam/dlxì ì¶€ì¶ë 칞 ì§ìŽê³ ê°ì ëŒìŽëžë¬ëЬ
API륌 ëŽì£Œë¯ë¡, dlxì ìì íë¡ê·žëšìŽ ê±°ì ê·žëë¡ ì®ê²š ìšë€.
ëŒìŽëžë¬ëЬë 묞íì íë¡ê·žëšìŽë€. ìì€ ì ì²Žê° íêžë¡ ì°ìž ë€ì¯ ê°ì
GWEB 묞ìì ë€ìŽ ìë€ â dcells.w,
ssxcc.w, ssmcc.w, xccdc.w,
zdd/zdd.w. ìë
ìì€ë 묞íì íë¡ê·žëšìŽë€ë¥Œ 볎ëŒ.
ìì§ì í¬ëì€ ìì ì ì±
ìë ìš ëš¹ëë€. ëë í°ëЬ
taocp-7.2.2.1-exercises/ìë TAOCP §7.2.2.1ì
ì°ìµë¬žì ì ê·ž ëµì íëì© êŒŒêŒŒí ìœì êžìŽ ëë í°ëЬë§ë€ íëì© ë€ìŽ ìë€. ìë
Careful readings of TAOCP 7.2.2.1ì 볎ëŒ.
package main
import (
"fmt"
"strings"
cells "github.com/sjnam/dancing-cells"
)
func main() {
input := `a b c d e f g
c e
a d g
b c f
a d f
b g
d e g
`
xc := cells.NewXCC()
res := xc.Dance(strings.NewReader(input))
for sol := range res.Solutions {
for _, opt := range sol {
fmt.Println(opt) // optë []stringìŽë€. ìŽë¥Œí
멎 [a d f]
}
}
}- íšì
NewXCC()ë*XCC륌 ëë €ì€ë€. íëDebug = trueë¡ ë멎 dlxì²ëŒ ì ë ¥ ììœê³Œ ë§ë¬ŽëЬ íµê³ë¥Œ stderrì ì°ëë€. - ë©ìë
Dance(io.Reader) *Resultë DLX í ì€ížë¥Œ ìœìŽResult{ Solutions <-chan []Option, Heartbeat <-chan string }ì ëë €ì€ë€. - íì
Optionì[]stringìŽê³ ê·ž ìµì ì ììŽí ìŽëŠë€ìŽë€(ììŽ ë¶ì ë¶ ììŽí ìname:cë¡ ëìšë€). 목ë¡ì ìžì ë ì ë ¥ ì°šë¡ìŽë¯ë¡opt[0],opt[1], âŠì²ëŒ ìëŠ¬ë¡ ì°Ÿì ìšë ëë€(NewXCCDCë§ ììžìžë° ìëì ì ëë€). - íìì ê³ ë£šíŽìì ëê³ ë³ŽëŒ ëë§ë€ ë©ì¶ë¯ë¡, ì±ë
Solutions륌 íë ìªœìŽ ìë륌 ì¥ë€. ë©ìëWithContext(ctx)ë 묞맥ctxê° ëꞰ멎 íìì ê·žë§ëê² íë€(첫 íŽë§ ë°ê³ ìë ê² ììŽ ë©ì¶ ìë ìë€).
ìµì
ë§ë€ ê°ìŽ ë§€ê²šì ž ìê³ ëªšë ë®ê°ê° ìëëŒ ê°ì¥ ìŒ ë®ê°ë¥Œ ìíë€ë©Ž, Dance
ëì Minimize륌 ìŽë€.
xc := cells.NewXCC()
res := xc.Minimize(strings.NewReader(input), func(o int, opt cells.Option) int {
return price(opt) // oë ê·ž ìµì
ì ë²ížë€. ì
ë ¥ ì°šë¡ë¡ 1, 2, âŠ
})
for sol := range res.Solutions {
// ë®ê°ê° ë¿ì ëë§ë€ ìì ê²ë³Žë€ ë°ëì ìžë€. ë§ì§ë§ ê²ìŽ ìµì ìŽë€
}- ê° íšìë ì ë ¥ì ìœê³ ë ë°ë¡ ë€ì ìµì ë§ë€ í ë²ì© ë¶ëаë€.
- ë¶êž°íì ìŽë€. ìŽì ê» ê°ì¥ ì¢ì ë®ê°ë¥Œ ìŽêžž ì ìë ê°ì§ë ë²ë €ì§ë¯ë¡, ì±ë
Solutionsë ë°ëì ëìì§ë ì¬ì¬ì 걎ëšë€. - 죌 ììŽí
ë§ë€ ìžêžì 맀Ʞëë°, í¬ëì€ì
DLX5ìì ìš ê²ìŽë€. ê·ž ììŽí ì ì§í©ìì ê°ì¥ ìŒ ìµì ì ê°ìŽ ê·ž ììŽí ì ìžêžìŽë€. ìŽë ë®ê°ë ìžêžì êŒ í ë²ì© 묌ë¯ë¡, ìì§ ë®ìŽì§ ìì ììŽí ë€ì ìžêž í©ìŽ ê±°ì ì»ë ííìŽë€. ê·ž ííì ìžì ë ìŒì ž ìë€. ëë¶ì XCCììë ìì ê°ë ìž ì ìë€. - ìžêžì í ë² ë ë¶ë €ì§ë€. ë§ëë§ë€ ê·ž ë§ëê° ëë ê°ë¹í ì ìë ìµì
ì
ì§ì°ëë°, ìê°(ê°ìì ìžêžì ëº ê²)ìŽ cutoffìì ìŽì ê» ìŽ ê°ê³Œ ìì§ ë¬ŒìŽìŒ
í ìžêžì ëº ê²ë³Žë€ ìì§ ìì ìµì
ìŽ ê·žê²ìŽë€. íë¡ê·žëš
DLX5ë ììŽí ë§ë€ 늬ì€ížë¥Œ ì ë ¬íŽ ëìŽ ìŽ ìŒì íëë°, í¬ì ì§í©ì ìì í ëë§ë€ 칞ì ë§ë°êŸžë¯ë¡ ê·žëŽ ì ìë€. ê·žëì ì¬êž°ìë 몚ë ìµì ì í ì€ë¡ í ë²ë§ ì ë ¬íŽ ëê³ , ë§ëë§ë€ ì ë¶ëªšê° ë©ì¶ ì늬ìì ìŽìŽ ê°ë€. ê·žë¬ë©Ž ë¶êž° ê·ì¹ìŽ ê°ë¹í ì ìë ìµì ë§ ìžê³ ,Boundë ê·žê²ë§ 볞ë€. - íë
xc.Best = kë ê°ì¥ ìŒ ë®ê° íëê° ìëëŒ kê°ë¥Œ ë¬ëŒë ë»ìŽë€. ê·žë¬ë©Ž ìŽì ê» ë³ž kë²ì§žë¡ ìŒ ê²ë³Žë€ ìŒ ë®ê°ê° ëì¬ ëë§ë€ ë¿ê³ , íììŽ ëë멎 ë¿ì ê² ê°ìŽë° ê°ì¥ ìŒ kê°ê° ìŽ ë¬žì ì ê°ì¥ ìŒ ë®ê° kê°ë€. ê° kê° 1ë³Žë€ í¬ë©Ž ì¬ì¬ì í ë°©í¥ìŽ ìëë€. - íë
xc.Bound = func(f cells.Frame) int { ⊠}ë ë§ëë§ë€ ë¶ë¶ ë®ê°ë¥Œ ë§ì ì§ë ë° ëë ê°ì ííì ëŽì€ë€. ë겚ì§ìŽ í¬ê² ë§íŽìë ì ëë€. íëf.Live륌 íìŒë©Ž ìŽìëšì (ììŽí , ìµì ) ììŽ ëì€ê³ ,f.Cost(opt)ìf.Name(item)ìŒë¡ ê·žê²ì ìœìŒë©°,f.Need(item)ì ê·ž ììŽí ìŽ ììŒë¡ ëª ë² ë ë®ì¬ìŒ íëì§ë¥Œ ë§íë€(XCCììë ìžì ë 1ìŽë€). íììBoundì ìžêž ê°ìŽë° í° ìªœì ìŽë€. íëBound륌 nilë¡ ë멎 ìžêžë§ìŒë¡ ê°ì§ë¥Œ ì¹ë€. - íšì
NewMCC()ìë ìë€. ê°ìMinimizeìBestìBoundê° ìê³ , ê±°êž°ìëNeedê° 1ì ëì ì ìëë° ê·žê²ìŽ ìŽ íë륌 ë ê¹ë ì ë¶ë€. ìžêžì ë€ì€ëê° ì íŽì§ ììŽí (1:2|aê° ìëëŒ2|a)ìë§ ê±·ëë°, ê·žë° ììŽí ë§ìŽ ìŽë ë®ê°ììë ê°ì íìë¡ ë®ìŽêž° ë묞ìŽë€. ê·žë° ììŽí ì íëë ëŽì§ ìì ìµì ìë ìì ê°ì 맀Ꞟ ì ìê³ , ê·žë¬ë©ŽMinimizeê° panicíë€. íšìNewXCCDC()ìëMinimizeê° ìë€. ë®ê°ë¥Œ ì ë¿ ê°ì 맀Ʞì§ë ìëë€. - ë©ìë
Danceë ìŽ ê°ìŽë° ìŽë ê²ìë ìëì§ ìëë€.
죌ììŽ ìë 첫 ì€ì ììŽí
ìŽëŠì ëìŽëëë€. 죌 ììŽí
, ê·žë€ì |, ê·žë€ì ë¶
ììŽí
ìŽë€(ë¶ ììŽí
ì ìµì
ììì ìì ë°ì ì ìë€). ê·ž ë€ì ì€ì ì ë§ë€ ìµì
íëë€. êžì |ë¡ ììíë ì€ì 죌ììŽë€.
íšì NewMCC()ë *MCC륌 ëë €ì£Œëë°, Dance/Result/Option APIë ê°ë 죌
ììŽí
ìŽ ë²ìë§íŒ ë®ìŽëë¡ íëœíë€(í¬ëì€ì SSMCC, ìŽì§ ë¶êž°ë€). ììŽí
ì€ì
ë€ì€ë륌 ìì ë¶ìžë€. ì ë ꌎì low:high|nameìŽë high|nameìŽê³ Ʞ볞ê°ì
1:1ìŽë€.
ìŽë¥Œí
멎 2|aë ììŽí
aê° êŒ ë ë² ë®ì¬ìŒ íë€ë ë»ìŽë€. ë€ì€ë륌 ê·žë¥ ë멎
ì¬ë XCC륌 íë¯ë¡ NewXCC륌 ê³ ì€ëí íëë€(íí°ì§ ìì ê° ìŽê²ì ìŽë€).
íšì NewXCCDC()ë *XCCDC륌 ëë €ì£Œëë°, NewXCC()ì ê°ì 묌ìì ê°ì
Dance/Result/Option APIì ê°ì ì
ë ¥ìŒë¡ ëµíë íšì¬ ë©ëЬ ëŽë€ë³žë€. ìŽ
ìì§ì ëë©ìž ìŒêŽì±ì ì§íšë€. ìŽë€ ìµì
ì ì°êž°ë§ íŽë ë€ë¥ž ìŽëê°ì 죌
ììŽí
ì ìµì
ìŽ íëë ëšì§ ìëë€ë©Ž ê·ž ìµì
ì ê·ž ì늬ìì ëŽë²ëŠ¬ê³ , ê·ž ì¹ìì
ììŽí
ë§ë€ ìŽìëšì ìµì
ë€ìŽ ìë¡ ë°ì³ ì€ ì ìê² ë ëê¹ì§ 묌결ì¹ë€. ë§íì멎
DLX-PRE륌 ë§ëë§ë€, ë°ë¥ê¹ì§ ë€ì ë늬ë ì
ìŽë€.
dc := cells.NewXCCDC()
for sol := range dc.Dance(strings.NewReader(input)).Solutions {
// NewXCC()ê° ì°Ÿë ê²ê³Œ ê°ì ë®ê°ë¥Œ, ëê° íšì¬ ì ì ë§ëë¡ ì°Ÿëë€
}
fmt.Println(dc.Nodes(), dc.Updates(), dc.Purges())ë§ëë ë¹ìžì§ê³ , ê·ž ìë íšì¬ ì€ìŽë ë€. ê·ž ê±°ëê° ìŽë 쪜ìŒë¡ êž°ì°ëì§ë ìì§ìŽ ìëëŒ ë¬žì ì ì±ì§ìŽë€. ìŽ ì ì¥ìì ìì ëì ë ìì§ìŒë¡ ê°ê° íìŽ ë³Žë©Ž ìŽë ë€.
| 묞ì | XCC | XCCDC |
|---|---|---|
examples/filomino/15x15.filomino.dlx |
ë§ë 133,639ê°, 11.1ìŽ | ë§ë 82ê°, 54ms |
examples/pentominoes/8x8.dlx |
ë§ë 93,833ê°, 0.32ìŽ | ë§ë 12,295ê°, 2.0ìŽ |
íšì NewXCC()ì ë€ë¥ž ì ëì ìì ë ê°ìŽ ìë€. ë©ìë Purges()ë ëë©ìž
ìŒêŽì±ìŽ ì¹ìŽ ìµì
ì ì륌 ìžê³ , Debug = trueë¡ ë멎 첫 ê°ì§ë¥Œ ë»êž°ë ì ì ê·ž
ê°ìŽë° ëª ê°ê° ëê°ëì§ë¥Œ ìë € ì€ë€. ê·žëŠ¬ê³ ìŽ ìì§ì ìµì
ë§ë€ 죌 ììŽí
ìŒë¡
ììíꞰ륌 ë°ëŒê³ ê·žë ì§ ììŒë©Ž ì
ë ¥ ë ë
žë륌 ì®ê²š ëìŒë¯ë¡, ë¶ ììŽí
ì ìì
ëê³ ìŽ ìµì
ì ê·ž 첫 죌 ììŽí
ìŽ ìì ìš ì±ë¡ ìë €ì§ë€. ëëšžì§ë ì
ë ¥ ì°šë¡ë¥Œ
ì§íšë€. ë©ìë Minimizeë ìë€.
ìì ìž ìì§ì íŽë¥Œ íëì© ê±Žë€ì€ë€. íŽê° 10¹â¶ê°ìž 묞ì ìë í늰 몚ììŽë¯ë¡,
zdd/ë 몚ë íŽë¥Œ í꺌ë²ì ZDDë¡ ëë €ì£Œë ë·ì§ž ìì§ìŽë€. ê·ž 겜ë¡ê°
ë°ë¡ ì í ë®ê°ìž ê²°ì ë€ìŽìŽê·žëšìŽë€. í¬ëì€ì
DLX6
ì°©ì(Nishino, Yasuda, Minato, Nagataì 2017ë
ë
Œë¬žì ë°ë¥ž ê²ìŽë€)ì í¬ì ì§í©
ìì ì¬ëа ê²ìžë°, ìµì
ëª ê°ë¥Œ ê³ ë¥Žê³ ëšì ë¶ë¶ 묞ì ë ìŽë ììŽí
ìŽ ëšìëëìë§
ë¬ë žìŒë¯ë¡ ìŽì ê» íŒ ë¶ë¶ 묞ì 륌 êž°ìµíë íìì ê°ì ê²ì ë ë² íì§ ìëë€.
ë€ìŽìŽê·žëšì í¬ëì€ì BDD15륌 Goë¡ ì®êžŽ
sjnam/bddìì ìšë€.
import zdd "github.com/sjnam/dancing-cells/zdd"
d := zdd.New().Dance(strings.NewReader(input))
fmt.Println(d.Count()) // *big.Int â ë€ìŽìŽê·žëšì í ë² ê±·ëë€
fmt.Println(d.Nodes()) // ë€ìŽìŽê·žëšì í¬êž°
best, weight, _ := d.MaxWeight(w) // ê°ì¥ ë¬Žê±°ìŽ ë®ê°, íì ììŽ
one, _ := d.Random(rnd) // 몚ë ë®ê°ì ëíŽ ê³ ë¥Žê² ë¬Žììë¡
for sol := range d.Solutions() { ⊠} // ìíë€ë©Ž ì¬ì í íëì©
z, root := d.ZDD() // bdd ìì¡ìŽ, ëëšžì§ë 몚ë ê±°êž°ìíìŽêž°ë ë€ë¥ž ìì§ë€ì²ëŒ ìµì
ìŽ ê°ì¥ ì ì ììŽí
ìì ë¶êž°íë€. íë MRV륌 ë멎
ë²ížê° ê°ì¥ ìì ìŽì ìë ììŽí
ìì ë¶êž°íëë°, í¬ëì€ì ì°ìµë¬žì
7.2.2.1-264ê° ê·žê²ìŽë€. ëìì€ë ë€ìŽìŽê·žëšì ìŽë 쪜ìŽë ê°ë€. ì€ì¬ì ì°šë¡ê°
ì¡í ZDDë ê·ž ì§í©ì¡±ê³Œ ë³ì ì°šë¡ë¡ ì íŽì§êž° ë묞ìŽë€. ë€ë§ êžžê³ ê°ë ììììë
ê·ž ìžêž°ê° ë ìžë€.
ìŽê²ìŽ ê°ì íëì§ë ìì§ìŽ ìëëŒ ë¬žì ì ì±ì§ìŽë€. íì ë§ë 칞ì ìŽ ìì§ìŽ ë€ë¥Žë ììŽê³ , ìëì ìºì ìë ë€ë¥ž ìì§ë€ìŽ ë€ë¥Žë ì륌 ê·žê²ìŒë¡ ëë ê°ìŽë€. ê°ì¥ í° í ëì ìŽëŠŒê°ìžë°, 5.3 à 10¹â¶ê°ì§ ë®êž°ë¥Œ ìžìŽ ë³Žê² ë€ê³ ëì€ ì¬ëìŽ ìêž° ë묞ìŽë€. ìºìë ê·ž ë§ë ìê° ê·ž ê°ìŽë° ìë¡ ë€ë¥ž ë¶ë¶ 묞ì ì ì륌 ëìŽìë ë°°ìë§íŒ ìŽêžŽë€.
| 묞ì | íŽì ì | íì ë§ë | ìë |
|---|---|---|---|
| 8 à 8 ëë¯žë ž | 12,988,816 | 2,317 | 21,600à |
| 10 à 10 ëë¯žë ž | 258,584,046,368 | 13,560 | 7.4 à 10â· |
| 12 à 12 ëë¯žë ž | 5.3 à 10¹ⶠ| 74,023 | 2.8 à 10¹² |
| 6 à 10 íí ë¯žë ž | 9,356 | 822,828 | 1.5à |
| ëí¬ë 11 | 17,792 | 130,724 | 1.3à |
| 8-íž | 92 | 869 | 1.1Ã |
ê³ ë¥ž 몚ìì ììì ë®ë 묞ì ë ìê³ ìë¡ ìêŽìë ì¡°ê°ìŒë¡ ëëë¯ë¡ ê±°ì 몚ë
ë¶ë¶ 묞ì ê° ëíìŽëë€. íí 믞ë
ž ìŽëì 몚ë ë€ë¥Žë¯ë¡ ëíìŽëë ê²ìŽ ê±°ì ìê³ ,
1.5배륌 ìëŒìê³ ìëª
700,000ê°ì§ëЬ ìºì륌 묎ë ê²ì ë°ì§ë ê±°ëë€. ê·žë° ê²ìë
NewXCC()륌 ì°ëŒ. ë°ë©Ž 10 à 10 íì 2580ìµ ê°ì§ ë®êž°ë¥Œ 몚ë ìžë ë°ë 36msì
ë§ë 13,161ê°ì§ëЬ ë€ìŽìŽê·žëšìŽë©Ž ëê³ , ê·ž ê°ìŽë° ê°ì¥ ë¬Žê±°ìŽ ê²ì ì°Ÿë ë° 0.8msê°
ë ë€ ë¿ìŽë€. ë ë€ ë±ë±ìŽ ëìŽëììë ë¿ì ì ìë€.
íší€ì§ zddê° ë°ë¡ ì ìë ê²ì íµì¬ìŽ êž°ëë ê² ììŽ ëšê² íë €ë ê²ìŽë€.
ëª
ë ¹ go get github.com/sjnam/dancing-cellsì ì묎ê²ë ëìŽì€ì§ ìê³ ,
.../dancing-cells/zdd륌 importí ëìë§ bddê° ëžë € ìšë€.
| ìì | ì€í |
|---|---|
| N-íž | go run ./examples/queen 8 |
| ëí¬ë ì§ | go run ./examples/langford 4 |
| íí ë¯žë ž | go run ./examples/pentominoes examples/pentominoes/6x10.dlx |
| ì€ëì¿ | go run ./examples/sudoku examples/sudoku/puzzles.txt |
| íë¡ë¯žë ž | go run ./examples/filomino examples/filomino/10x10.filomino.dlx |
| ìŒë£©ë§ íŒìŠ | go run ./examples/zebra |
| íí°ì§ (ë€ì€ë) | go run ./examples/partridge 8 |
| ëë¯žë ž ë®êž° (ZDD) | go run ./examples/domino -aztec 8 |
| ë±ë§ ì°Ÿêž° | go run ./examples/wordsearch examples/wordsearch/movie.txt 13 13 |
| ì€ë¬Œë ì륌 ë®ë ë€ì¯ ë±ë§ | go run ./examples/words examples/words/sgb-words.txt 5 |
| ê°ì¥ ìŒ ëŒíŽ ë°©ì§ í¡ëš | go run ./examples/transversal -plain 11 |
| ê°ìŽë°ê° ë¹ íí°ì§ | go run ./examples/hollow -z 16 |
ìì ë ì ë§ë€ 묞ì 륌 DLX í
ì€ížë¡ ì§ìŽëŽê±°ë íìŒìì ìœìŽ Danceì ëêž°ê³ ì±ë
Solutions륌 ë¹ìŽë€. dlx ìì ì ê°ì 볞ìë€. ììŽí
ìŽëŠê³Œ ìì êžžìŽì ì íìŽ
ìë(ì¬ë¬ ë°ìŽížì¬ë ëë) 묞ììŽìŽë¯ë¡, ìŒë£©ë§(N0:England)ë íêž ë±ë§
ì°Ÿêž°ë ê·žëë¡ ëë€. ë€ì€ëê° íìí íí°ì§ë NewMCCë¡ íŒë€. ìŽë¡ìš dlxì
ìì ê° ëªšë ì¶€ì¶ë 칞ìŒë¡ ì®ê²šì¡ë€.
$ go run ./examples/langford 4
[2 3 4 2 1 3 1 4]- ì¡°ê° 12ê°: O P Q R S T U V W X Y Z
$ cd examples/pentominoes
$ go run pentominoes.go 8x8.dlx
1:
Q Q X U U V V V
Q X X X U V Z Z
Q R X U U V Z S
Q R R . . Z Z S
R R Y . . W S S
Y Y Y Y W W S T
P P P W W T T T
P P O O O O O T
2:
Q Q X U U V V V
Q X X X U V Z Z
Q S X U U V Z O
Q S T . . Z Z O
S S T . . W W O
S T T T W W R O
P P P Y W R R O
P P Y Y Y Y R R
3:
Q Q X U U V V V
Q X X X U V Z Z
Q S X U U V Z Y
Q S T . . Z Z Y
S S T . . W Y Y
S T T T W W R Y
P P P W W R R R
P P O O O O O R
...$ go run ./examples/queen 8
1:
. . . Q . . . .
. . . . . Q . .
. . . . . . . Q
. . Q . . . . .
Q . . . . . . .
. . . . . . Q .
. . . . Q . . .
. Q . . . . . .
2:
. . . Q . . . .
. Q . . . . . .
. . . . . . . Q
. . . . . Q . .
Q . . . . . . .
. . Q . . . . .
. . . . Q . . .
. . . . . . Q .
...$ cd examples/sudoku
$ go run sudoku.go puzzles.txt
Q[ 1]: ..43..2.9..5..9..1.7..6..43..6..2.8719...74...5..83...6.....1.5..35.869..4291.3..
A[ 1]: 864371259325849761971265843436192587198657432257483916689734125713528694542916378
Q[ 2]: .4.1...5.1.7..396.52...8..........17...9.68..8.3.5.62..9..6.5436...8.7..25..971..
A[ 2]: 346179258187523964529648371965832417472916835813754629798261543631485792254397186
Q[ 3]: 6..12.384..8459.72.....6..5...264.3..7..8...694...3...31.....5..897.....5.2...19.
A[ 3]: 695127384138459672724836915851264739273981546946573821317692458489715263562348197
Q[ 4]: 4972.....1..4....5....16.9862.3...4.3..9.......1.726....2..587....6....453..97.61
A[ 4]: 497258316186439725253716498629381547375964182841572639962145873718623954534897261
Q[ 5]: ..591.3.8..94.3.6..275..1...3....2.1...82...7..6..7..4....8....64.15.7..89....42.
A[ 5]: 465912378189473562327568149738645291954821637216397854573284916642159783891736425
...
Q[70098]: ..2.....9.3...25....61..37..........2..4..13...7..6.4...18.....76...54....9..76..
A[70098]: 472653819138792564956148372694531287285479136317286945521864793763915428849327651
Q[70099]: .3............1..87..58........24.5..4.8739....36.....9.......2..5..2.912.....7.4
A[70099]: 438297165659431278721586349167924853542873916893615427974168532385742691216359784
Solving took: 2.142709417s$ cd examples/filomino
| ..3.3...3.
| ..131...43
| 64...141..
| .6...4.4..
| 64...141..
| ..434...12
| ..3.3...2.
| ..434...12
| 24...161..
| .2...6.6..
$ go run filomino.go 10x10.filomino.dlx
3 3 3 1 3 3 2 2 3 3
4 4 1 3 1 3 4 4 4 3
6 4 4 3 3 1 4 1 2 2
6 6 6 6 4 4 1 4 4 4
6 4 3 3 4 1 4 1 4 2
4 4 4 3 4 3 4 4 1 2
3 3 3 1 3 3 4 2 2 1
2 4 4 3 4 4 6 6 1 2
2 4 4 3 4 1 6 1 3 2
1 2 2 3 4 6 6 6 3 3ë±ë§ ì°Ÿêž°ê° ë¬Žììžê°? https://thewordsearch.com/
ë±ë§ì ìžì ë ê°ì ì늬ì ëìŽì§ë§ ëšë 칞ì ì묎 êžìë¡ë ì±ì°ë¯ë¡, ë ë² ëë €ì ëê°ì íìŽ ì°íë ìŒì ìë€.
$ cd examples/wordsearch
$ go run wordsearch.go movie.txt 13 13
1:
ëŽì¬ëŠê°ì겚ìžê·žëŠ¬ê³ ëŽì¬ì°š
ë·ìµì¶ììžìŽë°ìžì€ììì€ìŽ
ì¬ì ìŽìíììžížë©°ë°ëžë€êµ
ì¥í¬ëì¥ë²ìì¬ë³ëЬì¥ë§ê°ì€
íê²ìŽììì¹ìì¹ë ìëììœ
íìíì ì£ìë³ì íìžìŽë êž°
ë šëë¶êµê»ííŽíêž°í볎ëŽì
곚ëì°êŽ íšìëêžê·¹ìœ€ë멌ìž
ë§ìíꞰ곌ë°ë°€ìíë¬ì¬íê·ž
ëë³µì ìì 견곌ìšì ìì€ëª
ë
í¬ììì¶©ì¹êµ¬ë®ê°ìëìíë
컎ê°ê³µêŽŽë ì§ë¹ ì묌ì°ê°ì§ëŒ
ì°ìšê³µê¶ 묌ê²íëìê²íë°ì
$ go run wordsearch.go mathematicians.txt 15 15
1:
W E I E R S T R A S S T S M H
A Z L H C A N T O R R J U V R
O T T E N N E S N E J D I U E
Y E P E R R O N V R N C N P Q
S E J T L E I T S A A G E O R
F F O K R A M P R O E I B R H
P D H U R W I T Z N K H O E I
L G D S V K R Z A S Y E R T L
E N R Y W E K L W L S R F S B
S I A A B U A O X E T M P E E
N L M O M T K Z T R E I P V R
E L A L A N D A U O R T O L T
H E D C I T B T K B N E N Y I
X M A M R E H S I A L G K S L
R V H X L T F F O H H C R I Kë€ì¯ ì¬ëìŽ ì ë§ë€ ë€ë¥ž ë€ì¯ ëëŒìì ìê³ , ë€ì¯ ê°ì§ ë€ë¥ž ìŒì íë©°, ë€ì¯ ê°ì§ ë€ë¥ž ë묌ì êž°ë¥Žê³ , ë€ì¯ ê°ì§ ë€ë¥ž ê²ì ë§ìë©°, ìê¹ìŽ ì ë§ë€ ë€ë¥ž ë€ì¯ ì§ì í ì€ë¡ ì°ë€.
- ìêµ ì¬ëì ë¹šê° ì§ì ì°ë€.
- íê°ë ìŒë³žìì ìë€.
- ë žë ì§ìë ìžêµêŽìŽ ì°ë€.
- 컀íŒë¥Œ ì¢ìíë ì¬ëì ì§ì ìŽë¡ììŽë€.
- ë žë¥ŽìšìŽ ì¬ëì ì§ì ë§š ìŒìªœìŽë€.
- ê° ì£Œìžì ì€íìžìì ìë€.
- ì°ì 륌 ë§ìë ì¬ëì íê°ìŽë° ì§ì ì°ë€.
- ë°ìŽì¬ëЬëì€ížë ì€ë ì§ ì£Œì€ë¥Œ ë§ì ë€.
- íì ì§ì ìŽë¡ ì§ ë°ë¡ ìŒìªœìŽë€.
- ì°í¬ëŒìŽë ì¬ëì 찚륌 ë§ì ë€.
- ë žë¥ŽìšìŽ ì¬ëì íë ì§ ìì ì°ë€.
- ì¡°ê°ê°ë ë¬íœìŽë¥Œ Ʞ륞ë€.
- ë§ì ìžêµêŽ ìì ì°ë€.
- ê°ížì¬ë ì¬ì° ìì ì°ë€.
ìŒë£©ë§ì êžžë€ìŽë ì¬ëì ë구ìŽê³ , ë§¹ë¬Œë§ ë§ìꞰ륌 ì¢ìíë ì¬ëì ë구ìžê°?
$ go run ./examples/zebra
Norway Ukraine England Spain Japan
diplomat nurse sculptor violinist painter
fox horse snail dog zebra
water tea milk orange coffee
yellow blue red white green$ go run ./examples/partridge 9
âââââââââââââââââââ¬ââââââââââââââââ¬ââââââââââââââââââ¬ââââââââââââââââââ¬ââââââââââââ¬ââââââââ
â â â â â â â
â â â â â â â
â â â â â â 4â
â â â â â âââââââââ€
â â â â â 6â â
â â â â ââââââââââââ†â
â â 8â â â â 4â
â 9âââââââ¬âââââââââ†9â 9â âââââââââ€
âââââââââââââââ¬âââ†â âââââââââ¬ââââââ¬ââââŽââââââââ¬âââââââââ†â â
â â 2â 3â â â â â â â â
â âââââŽâââââ†â â 3â â â 6â 4â
â â â 5â 4ââââââ†â âââââ¬ââââââââŽââââââââ€
â â âââââââââââŽâââââââ†â â 5â 2â â
â â â â 3â 6âââ¬ââââââââŽâââ†â
â 7â 5â âââââââŽââââ¬ââââââââŽâ†â â
âââââââââââââ¬ââŽâââââââââ†â â â â â
â â â â â â â â
â â â â â â â â
â â â â 5â 5â 6â 8â
â â â âââââââââââŽââââââ¬ââââŽââââââââââââŒââââââââââââââââ€
â 6â 6â 9â â â â
âââââââââââââŽââ¬ââââââââââŽââââ¬âââââââââââââ†â â â
â â â â â â â
â â â â â â â
â â â â â â â
â â â â â â â
â â â â 8â 8â 8â
â 7â 7â 7âââââââââââââââââŒââââââââââââââââŒââââââââââââââââ€
âââââââââââââââŒââââââââââââââŒâââââââââââââ†â â â
â â â â â â â
â â â â â â â
â â â â â â â
â â â â â â â
â â â â â â â
â 7â 7â 7â 8â 8â 8â
âââââââââââââââŽââââ¬ââââââââââŽââââââââ¬ââââââŽââââââââââââ¬ââââŽââââââââââââââ¬ââŽââââââââââââââââ€
â â â â â â
â â â â â â
â â â â â â
â â â â â â
â â â â â â
â â â â â â
â â â â â â
â 9â 9â 9â 9â 9â
âââââââââââââââââââŽââââââââââââââââââŽââââââââââââââââââŽââââââââââââââââââŽââââââââââââââââââìì§ zdd ìì ìžìŽ íëë¿ìž ìì ìŽê³ , ê·žê² ììŽë ìž ì ììì ìì ë€. 8 à 8
íìë ë믞ë
žë¡ ë®ë ë²ìŽ 12,988,816ê°ì§, 12 à 12 íìë 53,060,477,521,960,000
ê°ì§ ìê³ , ì°šì nì ììŠí
ë€ìŽì몬ëìë ì íí 2^(n(n+1)/2)ê°ì§ ìë€.
ë±ë±ìŽ ëìŽëììë ì묎늬 íŽë ë¿ì§ 못í ìë€. ìŽ íë¡ê·žëšì ê·žê²ì ìžê³ , ìŒ
ê°ì Kasteleynì ê³±ì
ê³µì(ììŠí
ë€ìŽì몬ëëŒë©Ž ì íí 2ì ê±°ëì ê³±)곌 ë§ì¶°
ë³Žê³ , 몚ë ë®êž°ìì ê³ ë¥Žê² ëœì ë®êž° íë륌 ê·žëŠ¬ê³ , 칞ë§ë€ 묎ê²ê° 죌ìŽì¡ì ë
ê°ì¥ ë¬Žê±°ìŽ ë®êž°ë¥Œ ì°Ÿëë€. ìµë ë¬Žê² ìì ì§ì§êž°ë¥Œ ë€ìŽìŽê·žëš ìì 걞ì í ë²ìŒë¡
ížë ê²ìŽë€.
$ go run ./examples/domino -aztec 10
ììŠí
ë€ìŽì몬ë ì°šì 10: 칞 220ê°, ë믞ë
ž ì늬 400ê°
ë®ë ë°©ë²: 36,028,797,018,963,968ê°ì§
ë€ìŽìŽê·žëš ë§ë 1245866ê°, íì ë§ë 1118227ê°, ìëª
870349ê°, ì ì€ 247786ë²
2^(n(n+1)/2) = 36,028,797,018,963,968 ... ë§ë€
ê³ ë¥Žê² ëœì ë®êž° íë (ì ì 2400):
âââââ
âââŽââ¬ââŽââ
âââŽââ¬ââŽââ¬ââŽââ
âââŽââ¬ââŽââ¬ââŽââ¬ââŽââ
âââŽââ¬ââŒââ¬ââŒââ¬ââŒââ¬ââŽââ
âââŽââ¬â†â â â â â âââ¬ââŽââ
âââŒâââ†âââŽââŒââŒââŒââŒâ†âââââŒââ
ââ†âââââŒââŽââ¬â†â â â âââŒââ¬â†âââ
ââ†âââŒââ¬ââŒâââ†âââŒââŽââŒâ†â â ââ†âââ
ââ†ââ†â â âââ¬ââŽâ†ââââ†âââŒââŒâ†ââ†âââ
â ââ†âââŒââŽâ†âââ¬ââŽââŒââ¬ââŽâ†â â ââ†ââ†â
ââ†ââ†âââ¬ââŽâ†ââââ†âââââŒââŽââŒâ†ââ†âââ
ââ†ââ†âââ¬ââŒââŽââ¬ââŽââŒââââŒâââ†ââ†âââ
ââ†ââ†â âââ¬ââŒââââŒââââŒââ¬ââŽâ†âââ
ââ†âââŒâ†â âââ¬ââŽââ¬â†âââââŒââ
ââ†â âââŽâ†ââââ†âââŽââ¬ââ
âââŒââŽââ¬ââŽââŒââââŒââŽââ¬ââ
âââ¬ââŽââ¬ââŽââ¬ââŽââ¬ââ
âââ¬ââŽââ¬ââŽââ¬ââ
âââ¬ââŽââ¬ââ
âââââì 묎ìì ë®êž°ì ë€ ê·íìŽë¥Œ 볎ëŒ. 벜ëì²ëŒ ê³ ë¥ž 묎ë¬ë¡ ìŒìŽë¶ìê³ , ìŽì§ë¬ìì íê°ìŽë° ì ììë§ ëšì ìë€. ê·žê²ìŽ ë¶ê·¹ì(Jockusch, Propp, Shor, 1998)ìžë°, ê·žê²ì ë³Žë €ë©Ž 3.6 à 10¹â¶ê°ì§ ë®êž°ìì ê³ ë¥Žê² ëœì íë³žìŽ ììŽìŒ íë€. ë€ìŽìŽê·žëšì í ë² ê±žìŒë©Ž ëë ìŒìŽê³ , ë¬ëЬë ë ì ìë ìŒìŽë€.
ì늰 첎ì€íì ê·ž ë°ë쪜ì ë§íë€. ê¹ë° -cutì ë§ì£Œ 볎ë ë ê·íìŽë¥Œ ëŒìŽ ëŽê³ ,
ëµì ë§ë íëì§ëЬ ë€ìŽìŽê·žëšê³Œ íšê» 0ìŒë¡, ëª ë°ëŠ¬ìŽ ë§ì ëììšë€.
íìŒ sgb-words.txtë ë€ì¯ êžì ììŽ ë±ë§ 5757ê°ë¥Œ 몚ì ì€í íŒë ê·žëíë² ìŽì€ì
목ë¡ìŽë€. ê·ž ê°ìŽë° ë€ì¯ìŽë©Ž êžì ì늬 ì€ë¬Œë€ì¯ì ì±ì°ëë°, ê·ž ì늬ë€ìŽ ìíë²³
ì€ë¬Œë ì륌 ìë¡ ë€ë¥Žê² ë®ì ì ììê¹? (ì€ë¬Œë€ì¯ì ì ëë€. ìŽ ëª©ë¡ìë êžìê°
ìë¡ íëë ê²¹ì¹ì§ ìë ë€ì¯ ë±ë§ìŽ ìë€.) êžì
examples/words/words.wì ìë€.
$ go run ./examples/words examples/words/sgb-words.txt 8
frock glitz nymph squab vowed (o륌 ë ë², j x ë¹ ì§)
frock squab veldt whomp zingy (o륌 ë ë², j x ë¹ ì§)
frock glitz nymph squab vexed (vexed ììì 겹칚, j w ë¹ ì§)
foxed glitz nymph squab wreck (e륌 ë ë², j v ë¹ ì§)
fjord glitz nymph squab wreck (r륌 ë ë², v x ë¹ ì§)
frock glitz jived nymph squab (i륌 ë ë², w x ë¹ ì§)
frock glitz nymph squab waved (a륌 ë ë², j x ë¹ ì§)
foxed glitz nymph squab wrack (a륌 ë ë², j v ë¹ ì§)
íŽ 8ê°ì«ì 8 ëì 0ì 죌멎 몚ë ëìŽëëë€. 40ìŽì¯€ì ëµìŽ 9592ê°ë€. íìŽêž° ìì ìŽ
ëë €ì£Œë ê²ì êžì ì§í©ë§ë€ íëì© 8132ê°ìŽê³ , ê·ž íëíë륌 ê·žê²ì ìŽë£šë
ë±ë§ë€ë¡ íŒì¹ ê²ìŽë€. ë±ë§ stack곌 tacks ê°ì ìŽêµ¬ì ì² ì êžì ì§í©ìŽ ê°ì ëµìì
ìë¡ ë°ê¿ ìž ì ìêž° ë묞ìŽë€.
ë©ìë Minimizeì íë Bound륌 ì°ë ë ìì ê°ìŽë° 첫짞ë€. ëŒíŽ ë°©ì§ì
í¡ëšì íë§ë€, ìŽë§ë€, êž°ížë§ë€ 칞 íëì©ì ê³ ë¥Žë ê²ìŽë€. "êŒ í ë²"ìŽëŒë
ì ìœ ì
ìŽë, ììŽí
3nê°ì ìµì
n²ê°ì§ëЬ ì í ë®ê°ë€. 칞ë§ë€ ê°ì 맀Ʞ멎 묌ìì
ìŽë ê² ëë€. ìŽë í¡ëšìŽ ê°ì¥ ìŒê°?
ííìŽ íµì¬ìŽë€. êž°ížë¥Œ ììŒë©Ž ëšë ê²ì ìŽì ìë íì ìŽì ìë ìŽì ë§ì¶ë ìµìë¹ì© ë°°ì ìŽê³ , íê°ëЬì ìê³ ëŠ¬ìŠìŽ ê·žê²ì O(n³)ì ì íí íŒë€. ì ìœ íë륌 ë²ëŠ¬ë©Ž ëµì ìžì§êž°ë§ íë¯ë¡ ê·žê²ì ì±í ííìŽê³ , ìŽëŠŒìŽ ìëëŒ ë¶ë¶ 묞ì ì ì íí ìµì ê°ìŽë¯ë¡ ìŒ ííìŽë€. ë¶êž°ë ì¶€ì¶ë 칞ìŒë¡, íì ì íê°ëЬììŒë¡. ëžëì€ìì ììíë ê·ž êžì ìŽê²ì íê°ëЬ 묎곡 êž°ë²ìŽëŒ ë¶ë¥Žëë°, ìë ìê³ ëŠ¬ìŠ ëìŽ ë§ë¬ŒëЬë ì늬ì ë¶ìž ìŽëŠìŽì§ ì ì ì°šê° ìëë€.
$ go run ./examples/transversal -plain 9
0:81 1:887 2:847 3:59 [ 4:81] 5:318 6:425 7:540 8:456
...
ê°ì¥ ìŒ í¡ëšì ê° 1296, ë
žë 122ê°, 1ms
íí ììŽë ë
žë 155ê°, 0sìŽ ë°©ì§ì Z_nì ìŒìŒëЬ íìŽë¯ë¡ HallâPaigeì ë°ëŒ nìŽ íììŒ ëë§ í¡ëšìŽ ìë€(ê·ž ìë OEIS A006717곌 ë§ëë€. n = 5, 7, 9, 11ì ëíŽ 15, 133, 2025, 37851ìŽë€). ííì 묞ì ê° ìŽë €ìžìë¡ ë ê°ì íë€.
| n | ìžêžê³Œ ìžêž°ë§ | íê°ëЬì | ë¹ |
|---|---|---|---|
| 13 | 1,478 / 2ms | 535 / 3ms | 3Ã |
| 15 | 13,654 / 14ms | 3,926 / 23ms | 3Ã |
| 17 | 73,253 / 67ms | 9,374 / 42ms | 8Ã |
| 19 | 183,635 / 231ms | 37,801 / 216ms | 5Ã |
| 21 | 1,412,610 / 1.80s | 133,554 / 930ms | 11Ã |
| 23 | 7,915,018 / 11.3s | 706,998 / 5.57s | 11Ã |
| 25 | 40,935,232 / 68.2s | 1,955,438 / 18.3s | 21Ã |
íê°ëЬì ë§ë íëê° 6â9µsìžë° ë€ë¥ž 쪜ì 1.3â1.7µsìŽë¯ë¡, ííìŽ ë³žì ì ëœë ì늬ë n = 17곌 19 ì¬ìŽ ìŽëê°ë€. n = 25ììë 벜ìê³ë¡ 4ë°° ë¹ ë¥Žë€. ííìŽ ììŒë©Ž n = 25ì 1ë¶ìŽ ëê² ê±žëŠ¬ê³ , ììŒë©Ž n = 27ì 1ë¶ 20ìŽ, n = 29ì 4ë¶ 25ìŽ, n = 31ì 5ë¶ 18ìŽê° 걞늰ë€. ê·žë¬ë 벜ì n = 25쯀ìì n = 30쯀ìŒë¡ ë°ìŽ ì€ë€. ê·žëŠ¬ê³ nìŽ ì§ììŽë©Ž ì묎 ìŒë íì§ ìëë€. í¡ëšìŽ ììŒë©Ž ìŽêžž cutoffê° ìì ìêž°ì§ ìê³ , ë¶êž°íì ì ìŽêžž ê²ìŽ ìì ë€ìŽììŒ ë¹ë¡ì ìŒì íêž° ë묞ìŽë€.
ìŒìªœ 칞ì ìì ì ííìŽëŒê³ ë ì묎ê²ë ìë íììŽìë€. n = 19ìì ë§ë 1ìµ 1700ë§
ê°ì 19.5ìŽììŒë ë¹ê° 1429ÃìŽê³ 벜ìê³ë¡ 39Ãìë€. ê·žë¬ë€ ìì§ìŽ í¬ëì€ì DLX5ìì
ë ê°ì§ë¥Œ ë°°ì ë€(ê°ì¥ ìŒ ë®ê°ë¥Œ 볎ëŒ). ì²«ì§žìž ìžêžì ê·ž
칞ì ê±°ì ì€ë¬Ž ë°° ì€ìë€. ê·ž êžì ìžêžìŽ ì¬êž°ì ì 귞늬 ìŒì§ë¥Œ ì§ëë€. ììŽí
ìŽ
í, ìŽ, êž°íž ì°šë¡ë¡ ëìŽì ììŒë¯ë¡ ìžêžì íë§ë€ ìµìê°ì ë¹Œê³ ê·žë€ì ìŽë§ë€
ìµìê°ì 빌ëë°, ê·žê²ìŽ ë°ë¡ íê°ëЬì ìê³ ëŠ¬ìŠì ì¬ë íÂ·ìŽ ê°ì¶ìŽë€. ê·žë¬ê³ ëì
êž°ížê¹ì§ ê°ì¶íëë°, íê°ëЬì ííìŽ ëª» 볞 ì²íë ì¶ìŽ ê·žê²ìŽë€. ëì§žìž ìžêž°ë
ë§ëë§ë€ ê·ž ë§ëê° ëë ê°ë¹í ì ìë ìµì
ì ì§ì°ë¯ë¡ ë¶êž° ê·ì¹ìŽ ìŽì ìë
ì íì§ë§ ìžê² ëê³ , ê·žê²ìŽ ê·ž 칞ì ë€ì ì륞 배쯀 ì€ìë€(n = 21ìì 5ì²ë§ ë§ëê°
140ë§ ë§ëë¡). ëšì ë¹ë íê°ëЬì ííìŽ ë ë€ìê² ìë ë ê°ì§ë¡ ë²ìŽë€ìžë€.
ê°ì¶ ë€ì ìŠê° ëšê³, ê·žëŠ¬ê³ ê·ž 몚ë륌 ë§ëë§ë€ ìì§ ìŽì ìë 칞ì ëíŽ ë€ì
íë ê²ìŽë€. ííì ìžêž° ëë 볎ëë°, ìŽì ìžêž°ë¥Œ 견ë ëž ì¹žë€ì ëíŽ ë°°ì 묞ì 륌
íêž° ë묞ìŽë€.
ê·žëŠ¬ê³ ì²ì¥ìŽ ìëë°, ê·ž êžìŽ ìŽì ëëê³ ë§íë€. ê·ž ë¹ë ìžêžê³Œ ìžêž°ë§ ê°ì§ ê°ì íë¡ê·žëšì ê²¬ì€ ê²ìŽì§ ìµê³ ìì€ì ê²¬ì€ ê²ìŽ ìëë€. ìµìë¹ì© í¡ëšì ì ì ê³íìŒë¡ ì®ê²š ì êž°ê° ì§ëì¹ê² ìœê³ , ê·žë ê² ì ìŒë©Ž LP ìíê° ê±°ì ë¹íìë€. ìŽ íë¡ê·žëšìŽ 1ë¶ 20ìŽë¥Œ ì°ë n = 27ì ì¬ë§í MILP íìŽêž°ë 1ìŽì¯€ì ëëŽê³ ë¶êž°ë ê±°ì íì§ ìëë€. ì°ëЬ ê²ì ì¶ íë륌 íµì§žë¡ ë²ëŠ¬ê³ ìµì ê°ë³Žë€ 40%쯀 ìëì ëŽë €ìë ë°ë©Ž, LPë ì ì ë€ ì¥ê³ 10%ë ì± ëª» 믞ì¹ë€. íê°ëЬì ìê³ ëŠ¬ìŠìŽ ì°ëЬ ìí륌 ì íí íŒë€ë ê²ê³Œ ì°ëЬ ìíê° ì¢ë€ë ê²ì ìë¡ ë€ë¥ž ë§ìŽìë ì ìŽë€. ìŽ êž°ë²ì ìì ë ê°ìŽ ìë íìŽì§ë§, ìŽ ë°ë¥ìŽ ê·žê²ìŽ ì ê°ì íë ì늬ë ìëë€.
ê°ì í ì MCCì ë€ë ìŒìŽ ë ê¹ë€ë¡ìŽ ìªœìŽìë€. ìŽì§ ë¶êž°ìì ê°ì§ë¥Œ ë²ëЬë ìŒì ê°ì ì€íìŽ ë¹ìŽ ìë ì늬ììë§ ìì íë€. ê·žë ì§ ììŒë©Ž ë€ì ë§ëê° ëšì 칞ì ì ê°ì ìŽëìŒë¡ 죌ì ê°ëë°, ê±°êž°ì ê°ì ìŽëì ë¶êž°ê° ìëëŒ ìµì íë륌 ë€ìŽê³ ë€ë¥ž êžžì ìì ìëíì§ ìë ê²ìŽë€. ëµì ê·žëŽë¯í ì±ë¡ ëšê³ ë€ë§ ê°ì¥ ìŒ ê²ìŽêž°ë¥Œ ê·žì¹ë€. 묎ìì 묞ì ìì² ê°ë¥Œ 몚조늬 ìžìŽ ë³ž ëµê³Œ ë§ì¶° ë³Žê³ ììŒ ê·žê²ì ì¡ìë€.
ë©ìë Minimize륌 ì°ë ë€ë¥ž ìì ìŽê³ , Need륌 ë¶ëЬë ìì ë€.
íí°ì§ íŒìŠì kÃk ì ì¬ê°í kì¥ì©ì, k = 1âŠnì
ëíŽ, ë³ìŽ n(n+1)/2ìž ì ì¬ê°íì ì±ì ë£ë ê²ìŽë€. 1³+â¯+n³ = (1+â¯+n)²
ìŽë¯ë¡ ëìŽê° ë§ìëšìŽì§ë€. íŽê° ìë ê°ì¥ ìì ì°šìë 8ìŽë€. ìŽì ê°ì 맀Ʞì.
í íê°ìŽë°ì zÃz 구ìì ì íê³ , ê·ž ìì ìšì í ë€ìŽìë ì¡°ê°ë§ë€ 1ì
묌늰ë€. ê°ìŽ 0ìž ë®ê°ë 몚ë ì¡°ê°ìŽ êµ¬ìì í
ë늬륌 걞ì¹ë í, ê³§ í
ë¹ ì¬ì¥ìŽë€.
ì°í곌 ì¢ ìŽê° 묌ìì ì ë°ì ë§€ëì§ëë€. ë³ìŽ n ìŽíìž ì¡°ê°ì ì ê° ë®ë 칞ìì ë§ììŒ nâ1ë§íŒ ë»ìŒë¯ë¡, 구ì ììŒë¡ ê·žë§íŒ ìŽì ë€ìŽê° 칞ì 구ìì ê°í ì¡°ê°ë§ìŽ ë®ì ì ìë€. ê·ž ê°í 칞ë€ì (zâ2n+2)Ã(zâ2n+2) ë©ìŽë¥Œ ìŽë£šê³ , z ⥠2nâ1 ìŽë©Ž ê³§ë°ë¡ ë¹ì§ ìëë€.
í ë¹ ì¬ì¥ì z †2nâ2ìŒ ëìë§ ê°ë¥íë€.
ííì ê·ž ë
ŒìŠì ìì§ìŽê² ë§ë ê²ìŽë€. íë Frame.Live륌 íìŽ ìì§ ë®ìŽì§ ìì
칞ë§ë€ ê·žê²ì ìì§ ë®ë ê°ì¥ ìŒ ìµì
ì ì§ê³ , ê°ìŽ 0ìŽ ìë ê²ë€ ê°ìŽë° 첎ë¹ìŒí
ê±°ëŠ¬ë¡ ìë¡ n ìŽì ëšìŽì§ ê²ë§ ëšê²š í ì¡°ê°ìŽ ëì ëì 묌 ì ìê² í ë€ì, ê·ž
ê°ì ëíë€. ê·žë¬ë©Ž ì²ììë ìì ë¡ì ë€ê° ìµì
ìŽ ì£œìŽ ê°ë©° ê°íê² ëë 칞ì
ì°Ÿìëžë€. ì°šì 8ì í(36Ã36)ìì 2ë¶ì ëêž°ì§ ìêž°ë¡ íê³ ì¬ë©Ž ìŽë ë€.
| z | ìµìê° | ìžêžê³Œ ìžêž°ë§ | Need íí |
ê°í 칞 íí |
|---|---|---|---|---|
| 8 | 0 | 7,347 / 139ms | 7,347 / 1.76s | 7,347 / 1.78s |
| 12 | 0 | 9,128 / 156ms | 9,128 / 2.09s | 9,128 / 2.06s |
| 14 | †1 | â | â | â |
| 16 | 1 | 7,413 / 132ms | 7,413 / 1.74s | 7,413 / 1.77s |
구ììŽ z †12ìŽë©Ž ê° 0ì§ëЬ ë®ê°ê° ê±°ì ëëž ëì cutoffê° 0ìŒë¡ ëšìŽì§ê³ 몚ë ê°ì§ê°
cost + rest >= cutoffìì 죜ìŒë, ííì ìì í ì§ìŽë€.
구ììŽ z = 16ìŒ ëë êžì ì²ì ë§ì¹ ë€ì ìŽìŒêž°ê° ë¬ëŒì¡ë€. ííìŽ ìì ëë 2ë¶ê³Œ ë§ë
640ë§ ê°ë¡ ì묎ê²ë ìŠëª
íì§ ëª»íê³ , ê°í 칞 ííì 2ìŽë ì ëìŽ ë묎륌 묎ëëšë žë€.
ê·žë¬ë€ ìì§ìŽ ììŽí
ì ìžêžì ê±·êž° ììí멎ì
(ê°ì¥ ìŒ ë®ê°ë¥Œ 볎ëŒ), ìŽì Boundê° ìì ìë íììŽ
0.13ìŽì ëëë€. ìžêžìŽ ì°í ë
ŒìŠì íŒì íŽëŽë ê²ìŽë€. ê°í 칞ì ë®ë ìµì
ì 몚ë
ê°ìŽ 1ìŽë¯ë¡ ê·ž 칞ì ìžêžìŽ 1ìŽë€. ë©ìŽì ëšì ìž ì¹žì ì묎ê²ë ë¬Œì§ ìëë°, ì ë§ë€
첫 칞곌 ì¡°ê° íë륌 íšê» ì°ê³ ê·ž ì¡°ê°ì ìŽë¯ž ìê° 0ìŒë¡ ê¹ìêž° ë묞ìŽë€. ê°í 칞
ííìŽ ì 칞ë€ì n ìŽì ëŒìŽ ëì íŒíë ìŽì€ ê³ì°ìŽ ë°ë¡ ê·žê²ìŽë€. ë¿ëЬì ííìŽ
1ìŽê³ ê° 1ì§ëЬ ë®ê°ê° ìì ë€ìŽì€ë©Ž ëë¬Žê° ì£œëë€. ìžêžì ì
ë ¥ ë í ë² ê±·ìŒë¯ë¡
íì ëì€ì ê°íë 칞ì ë³Žì§ ëª»íë€. íëìì ê·žê²ìŽ ììŒë¡ ìŽ ííìŽ ëíŽ ì£Œë
몫ìŽìëë°, ë§ëë 9% ì ê³ ìê°ì 11ë°°ìë€. ê·žë¬ë€ ìì§ìŽ ë§ëë§ë€ ê°ë¹í ì ìë
ìµì
ì ìžìŽ ëŽêž° ììíê³ , íì ëì€ì ê°íë 칞ìŽë ê°ë¹í ì ìë ë§ì§ë§ ìµì
ìŽ
ë°©êž ìžë € ëê° ì¹žìŒ ë¿ìŽë ê°ì§ë ê±°êž°ì 죜ëë€. ìŽì ìž ì¹ž 몚ë ê°ì ë§ë륌 ë€ë¥žë€.
ììŒë¡ ìŽ ííì ëšì ê²ìŽ ìë€ë©Ž ë©ëЬ ëšìŽì§ 칞 ì¬ë¿ìŽ íšê» ê°íë 겜ì°ìŒ í
ë°,
ìžêž°ê° 칞ì íëì© ë³Žë ì늬ìì ê·ž ê°ë€ìŽ ëíŽì§êž° ë묞ìŽë€. ë€ë§ ìŽ íììë
ê·žë° ìŒìŽ ê°ì íì§ ìëë€.
íí Needë â í¬êž° kë ìì§ tì¥ìŽ ë íìíë° ìŽìëšì ëì ì늬 ê°ìŽë° ê³µì§ìž
ê²ìŽ uê°ë¿ìŽë tâuë ì¹ë¬ìŒ íë€ â íë Frame.Need륌 ìœë ííìŽê³ , ê·žê²ì
ë€ì€ëê° ììŽìŒ ë»ìŽ ìë€. ì¬êž°ìë ê°ì íì§ ëª»íë€ê³ ì ì§íê² ì ìŽ ëë€. ì¡°ê°ìŽ
ê°íëëë ê·žê²ìŽ ìŽëì ëŽë €ìëëì ë¬ë žëë°, ëì ì늬륌 í¬êž°ë¡ ëë±ê·žë €ìë
ê·žê²ì 볌 ì ìë€. ë íí 몚ë -bound ë€ì ëžë € ììŒë ìì íë ë€ì ì¬ìŽ ë³Œ ì
ìë€.
구ì z = 14 = 2nâ2ë ìŽëа ì±ë¡ ëšìë€. ê° 1ì 2ìŽì ì°Ÿì§ë§, ê° 0ì ì°Ÿì§ë 못íê³ ìë€ê³ ê°ëЬì§ë 못íë€. ì°í ë ŒìŠìŽ íëœíë ê°ì¥ í° êµ¬ììŽ ë°ë¡ ê·žê²ìŽê³ , ííìŽ ë¿ëЬìì 0ì ëë €ì£Œë ë§ì§ë§ ìëŠ¬ê° ë°ë¡ ê·žê²ìŽë€. ë¿ëЬì ê°í ì¹žìŽ ììŒë ê±°êž°ìë ìžêžë 0ìŽë€. ê° 1ì§ëЬ ë®ê°ë¥Œ í ë² ì°Ÿê³ ë멎 ìžêž°ê° ê° 1ì§ëЬ ìµì ì 몚ë ì§ì°ë¯ë¡, ëšë ê²ì ìì ë¡ìŽ ì늬ë€ë§ìŒë¡ íì ë®ì ì ìëê°ëŒë ë§š ì í ë®ê° 묌ììŽë€. ê·žë°ë° ê·žê²ì¡°ì°š 2ë¶ ìì ëëì§ ìëë€.
êžì examples/hollow/hollow.wì ìë€.
$ go run ./examples/hollow -z 16
ê°í ì¡°ê° 2ê° (ë
žë 7331ê°, 1.727s)
ê°í ì¡°ê° 1ê° (ë
žë 7399ê°, 1.741s)
...
ê°í ì¡°ê° 1ê°, ë
žë 7413ê°, 1.749sìì§ì í¬ëì€ê° TeXì ì°ë €ê³ ì§ìŽëž
묞íì íë¡ê·žëë° ë°©ììŒë¡
ì°ìê³ , ìŽìíŽ ìš SSXCCì SSMCCê° ì ì늬ì ê°ì ì íµì ë°ë¥žë€. í¬ëì€ ìì ìŽ
ê·žê²ì 묞íì CWEBìŒë¡ ìŒë€. í¬ëì€ê° DLX1, DLX2, DLX3ì ê¹ë° ë¬ëа í
íë¡ê·žëšìŽ ìëëŒ ë°ë¡ ì íë¡ê·žëšìŒë¡ ë ê²ì²ëŒ ì°ëЬë ê·žë ê² íë€.
| 묞ì | 묎ììžê° |
|---|---|
dcells.w |
ê³µì© ë°í â ê³µê° API(Option, Result, Frame), XCCì MCC ë ìì§ìŽ íšê» ì¶€ì¶ë ë
žë ë°°ìŽ, ê·žëŠ¬ê³ DLX íê°. 첫 쪜ë€ìŽ í¬ì ì§í© ìŽìŒêž°ë¥Œ ë€ë €ì€ë€. |
ssxcc.w |
XCC ìì§ â ìê¹ìŽ ë¶ì ì í ë®ê°, dê°ë ë¶êž°, ê·žëŠ¬ê³ ê°ì¥ ìŒ ë®ê°ë¥Œ ë€ë£šë ë§ì§ë§ ì¥. ì²ìë¶í° ëê¹ì§ íë¡ ìœíë€. |
ssmcc.w |
MCC ìì§ â ë€ì€ë, ìŽì§ ë¶êž°, ê·žëŠ¬ê³ ê°ì¥ ìŒ ë®ê°ë¥Œ ë€ë£šë ì 몫ì ì¥. ë§ì°¬ê°ì§ë¡ íë¡ ì ë€. |
xccdc.w |
XCC ìì§ì ë€ì, ìŽë²ìë ëë©ìž ìŒêŽì±ì ì§í€ë©° â ìŠìž, ë°©ìì 목ë¡, ëìŽì ê·ë, ê·žëŠ¬ê³ í ëšê³ê° ì¬ë¬ ìžµì 걞ì¹ë íì. ì ë žë íì ê¹ì§ ë°ë¡ ë ë§íŒ ìŽ ìì íë¡ ì ë€. |
zdd/zdd.w |
ZDD ìì§ â ê°ì íììŽë ëšì ììŽí ì ìëª ìŒë¡ ë©ëªšíŽ ëê³ , 몚ë íŽì ì§í©ì¡±ì ê²°ì ë€ìŽìŽê·žëšìŒë¡ ëë €ì€ë€. ì íší€ì§ë¡ ë°ë¡ ìê³ , ë€ë¥ž ëŒìŽëžë¬ëЬì êž°ëë ì ìŒí 묞ìë€. |
ìì ë·ì Go íší€ì§ dcells íëë¡ tangleëë¯ë¡ NewXCC(), NewMCC(),
NewXCCDC()ê° í ë²ì importë¡ ëžë € ìšë€. ë€ì¯ì§žë ê·ž ìì íší€ì§ dcells/zddë€.
Makefile ì ìŽ GWEB ë구륌 몬ë€. ì ì¥ìì ë¶ë¶ë§ë€ íëì©ìŒë¡ ëŒìŽëžë¬ëЬ, ìì , ì°ìµë¬žì ìœêž°ë€. ì ë§ë€ íë¡ ìê³ ì ë§ë€ ê°ì íê¹ì ì§ëë€.
make # .w íìŒì gtangleíŽ .goë¡ ë§ë ë€ì ë¹ë
make pdf # gweaveë¡ ëªšë 묞ì륌 ì¡°í
make clean # ìì±ë íìŒì ì§ì°ë 컀ë°ë ê²ì ëšêžŽë€ê·žë¬ë ê° íŽë¡ í ì ì¥ìë ìŽë ê² ì±ë¹íë€.
make && make -C examples && make -C taocp-7.2.2.1-exercisesì§ì§ ì볞ì .w íìŒìŽë€. ìì .wê° ìë .goë 몚ë, ì¡°íë 묞ìë 몚ë
ìì±ë¬ŒìŽë¯ë¡, ê° íŽë¡ íë€ë©Ž ê·žê²ë¶í° ëë €ìŒ íë€. ê·žëë 컀ë°íŽ ëë ìì±ë¬ŒìŽ ë
ê°ë ìë€. íëë ìì±ë .go íìŒ ë€ì¯ìŒë¡, GWEBì ëëŠ¬ì§ ìê³ ë íší€ì§ë¥Œ
importí ì ìê² íë €ë ê²ìŽë€. ë€ë¥ž íëë ì°ìµë¬žì ìœêž°ë§ë€ ëžëа verify.pdfë¡,
ë§ì°¬ê°ì§ë¡ ê·žë¥ ìœì ì ìê² íë €ë ê²ìŽë€. ë ë€ ììŒë¡ ê³ ì³ìë ì ëë€. ë구
gtangleìŽ //line ì§ì묞ì ëŽì£Œë¯ë¡, Go 컎íìŒë¬ì ì€ë¥ë ê·žê²ìŽ ë¹ë¡¯í .w
íìŒì ì€ì ê³§ì¥ ê°ëЬíšë€.
ìì ë€ì¯ 묞ìì ìëì ìì 묞ìë 몚ë íêžë¡ ì°ìê³
luatex(kotexgweb)ìŒë¡ ì¡°ííë€(ì°ìµë¬žì ìœêž°ë§ ì묞ìŽë€). ìì ë 묞íì
íë¡ê·žëšìžë°, ê±°êž°ì ì€ëª
ëë ê²ì ìì§ìŽ ìëëŒ ëªší ìžì°êž°ë€. íŒìŠìŽ ìŽë»ê²
ììŽí
곌 ìµì
ìŽ ëëì§, ìŽë ììŽí
ìŽ ì£ŒìŽê³ ìŽë ê²ìŽ ë¶ìžì§, ììŽ ë¬Žìì ë»íëë¡
ë§ë€ìëì§ë€. ìŽë 몚ë examples/<name>/<name>.wì ì°ë€. ê·ž ê°ìŽë° ì
ì ìë¡ í
ìŒì ëŽì ììžìŽë¡ ìœíê³ , ëëšžì§ë ì ë§ë€ 몚í ìžì°êž°ì ì°©ì íëì©ì íìŽ ëëë€.
| 묞ì | 묎ììžê° |
|---|---|
examples/domino/domino.w |
ìì§ zddë¡ ë믞ë
ž ë®êž° ìžêž° â Kasteleynì ê³µìì ì íí ì
곌 ë§ì¶° ë³Žê³ , ê³ ë¥Žê² ëœì ììŠí
ë€ìŽì몬ë ë®êž°ìì ë¶ê·¹ìì 볎며, ìµë ë¬Žê² ì§ì§êž°ë¥Œ íììŽ ìëëŒ ë€ìŽìŽê·žëšì ê±žìŽ ì°Ÿëë€. |
examples/words/words.w |
*ìíë²³ ì€ë¬Œë ì륌 ë®ë ë€ì¯ êžì ë±ë§ ë€ì¯ìŽ ìëê°?*ê° ìŽë»ê² DLX ì ë ¥ìŽ ëëê°. ê·ž ëµì ë€ì€ë ììŽ ìë§ìŒë¡ ë±ë§ ìê° êŒ ë€ì¯ìŒë¡ 묶ìžë€ë ê²ìŽë€. |
examples/transversal/transversal.w |
íê°ëЬ 묎곡 ì 5ë² â ëŒíŽ ë°©ì§ì ê°ì¥ ìŒ í¡ëšì ì¶€ì¶ë 칞ìŒë¡ ë¶êž°íê³ íê°ëЬì ìê³ ëŠ¬ìŠìŒë¡ íì íë€. ííì ìŽëì ì°Ÿìì§, ìŽ ííìŽ ì ì ííì§, ê·žëŠ¬ê³ ìŽ ì¬ì£Œê° ë ìŽëì ëš¹íëì§. |
examples/hollow/hollow.w |
A Partridge in a Pear Tree â íí°ì§ íŒìŠìŽ íê°ìŽë°ì ìŒë§ë í° êµ¬ë©ì ì§í¬ ì ìëê°. ê°ë§ ìë íìì 2ìŽì§ëЬ ìŠëª
ìŒë¡ ë°êŸžë êž°ííì íí, ê·žëŠ¬ê³ ì ì§íê² ë§íŽ ê°ì íì§ ëª»íë Need íí. |
examples/queen/queen.w |
n-íž â 죌 ììŽí 곌 ë¶ ììŽí ì ì°šìŽë¥Œ ê°ì¥ ë§ëíê² ë³Žì¬ ì€ë€. í곌 ìŽì êŒ í ë² ë®ì¬ìŒ íê³ ëê°ì ì ë§ììŒ í ë²ìŽë€. ììŽí ì€ì ì°šë¡ê° ì ì€ìíì§ë ëì€ëë°, ë¶êž° ê·ì¹ìŽ ë¹êžž ë ìŒìªœ ììŽí ìŽ ìŽêž°êž° ë묞ìŽë€. |
examples/langford/langford.w |
ëí¬ë ì§ â ë€ë¥ž ê²ìŽëŒê³ ë ì묎ê²ë ìë ì í ë®ê°ë€. ë¶ ììŽí ë ìë ìë€. íëë¿ìž 믞ë¬íšì ê±°ìž ëì¹ì 깚ë ìŒìžë°, íì ê°ìŽ ììŽìŒ íê³ ê·žë ë€ê³ ë§íŽ ì£Œë ì ìŽ ëìšë€. |
examples/pentominoes/pentominoes.w |
íí 믞ë
ž ìŽë â ìµì
ìŽ ë€ë¥ž ë°ì ë§ë€ìŽì§ 묞ì ëŒ, ìŽ êžì ìµì
ì ì°ë ìŽìŒêž°ê° ìëëŒ .dlx íìŒê³Œ ê·ž ìœìì ìœë ìŽìŒêž°ë€. |
examples/filomino/filomino.w |
íë¡ë¯žë ž â ë¶ ììŽí ì ììì ê°ì¥ìëŠ¬ë¡ ìŽë€. "ê°ì í¬êž°ì ë ììì ë§ë¿ì ì ìë€"ê° ê±°ì ëšìŽì§ë ê²ìŽ ê·ž ëìŽë€. |
examples/zebra/zebra.w |
ìŒë£©ë§ íŒìŠ â ìì ê°ìŒë¡ ìŽë€. ë¶ ììŽí ì ì±ìž ë¹ì¹žìŽê³ ê·ž ììŽ ê±°êž° ë€ìŽê°ë ê²ìŽë©°, ê°ì ë¹ì¹žì 걎ë늬ë ë ëšìë ë»ì 몚ììŒ íë€. ìŽ ííìŽ ê²°ìœ ë§íì§ ìë ê²(ë€ì¯ ëëŒê° ìë¡ ë€ë¥Žë€ë ê²)곌 ê·žë°ë°ë ëµìŽ ëì€ë ê¹ëê¹ì§. |
examples/wordsearch/wordsearch.w |
ë±ë§ ì°Ÿêž° í ì§êž° â ìì êžìë¡ ìŽë€. ê·žë¬ë©Ž êµì°šíë ë ë±ë§ìŽ ë§ëë ì늬ì êžìì ë»ì 몚ìŒëë°, êµì°šë¥Œ ë°ì§ë ìœëë ìŽëìë ìë€. |
examples/sudoku/sudoku.w |
ì€ëì¿ , 묎ëêž°ë¡ â íìì ììíêž° ì ì ëšìë¡ ë¬žì 륌 ê¹ì ëŽë ìŒ, ê·žëŠ¬ê³ íŒìŠ íìŒ íë륌 몚ë CPUì í©ìŽ í멎ìë ì ë ¥ ì°šë¡ë¡ ì°ìŽ ëŽë ìì ìë í¬ìž. |
examples/partridge/partridge.w |
íí°ì§ íŒìŠ â NewMCC()ê° ììŽìŒ íë íëë¿ìž ìì ìžë°, í¬êž° kì§ëЬ ì¡°ê° kì¥ìŽ ê³§ ë€ì€ëìŽêž° ë묞ìŽë€. 36 à 36 ë®êž°ë¥Œ 37ì€ì ëŽì ëŽë ìì 귞늌 ì¶ë ¥êž°ë ìë€. |
Knuth's news page asks
readers to take one exercise, read it and its answer very carefully, and report
back. taocp-7.2.2.1-exercises/ holds one such
reading per directory, written against Volume 4B, first printing, 2022, and
against the errata file of the day. Section 7.2.2.1 is the dancing-links
section, so most of them come down to an exact cover problem and the engines
above do the searching. The nineteen exercises that page lists for §7.2.2.1 all
have a reading here.
Each exercise's directory holds the report itself as README.md and the
program behind it as a GWEB literate program in verify/verify.w, with
verify/verify.pdf beside it so it can be read without installing GWEB.
Nothing is claimed that the program does not check.
Nine of the nineteen answers came out with nothing left to report. The other
ten each turned up something: 281,618 of answer 129 should be 294,457, the
3648 of answer 323 belongs to a 2 Ã 22 frame rather than a 2 Ã 21 one, answer
30 is broken by the one-node tree, and the puzzle answer 432 calls the hardest
cannot exist.
taocp-7.2.2.1-exercises/README.md indexes all
nineteen readings and gathers every correction in one place.