පයිතන් 3, 457 316 306 බයිට්
E=enumerate
V={'+'}
Q=[[(-j,i,k)for i,u in E(open(0))for j,v in E(u)for k in[{v}&V,'join'][u[j:j+2]=='|-']]]
while Q:
a,b,c,d,*e=A=tuple(x//2for y,x in sorted((y,x)for x,y in E(Q.pop())));e or exit('NOT')
if{A}-V:V|={A};Q+=[[c,d,a,b]+e,A,A[2:]+A[:2]][a<c<b<d:][c<a<d<b:]
if b==d:Q=[[a,c]+e]
exit('KNOT')
හහ්?
වැඩසටහන මුලින්ම ගැටය සෘජුකෝණාස්රාකාර රූප සටහනකට පරිවර්තනය කරයි, එය පහත සඳහන් සීමාවන් ඇත:
- එකම පේළියේ සිරස් හෝ තිරස් කොටස් දෙකක් නොමැත.
- තිරස් කොටසකට ඉහළින් සිරස් ඛණ්ඩයක් නොමැත.
උදාහරණයක් ලෙස, පළමු පරීක්ෂණ නඩුව පහත දැක්වෙන සෘජුකෝණාස්රාකාර රූපසටහනට පරිවර්තනය වේ:
+-----------+
| |
| | +-------+
| | | |
| +-------+ | | |
| | | | | |
| | +---+ | |
| | | | | |
| | | +---+ |
| | | |
| | | +-------+
| | | | | |
+-----+ | | | |
| | | | | |
| +---+ | | |
| | | | | |
| | +-------------+ | |
| | | | | |
| | | +---+ |
| | | | | |
| | | | +---+
| | | |
+-+ | |
| |
+-+
දකුණේ සිට වමට සිරස් කොටස්වල y ඛණ්ඩාංක අනුක්රමය මගින් අපි අද්විතීය ලෙස නිරූපණය කරමු:
(5,10, 1,9, 8,10, 9,12, 5,12, 1,4, 0,3, 2,4, 3,7, 6,8, 7,11, 2,11, 0,6)
ඉන්පසු එය අයිවන් ඩයිනිකොව් විස්තර කර ඇති පරිදි සෘජුකෝණාස්රාකාර රූප සටහන සරල කිරීම සඳහා සොයයි, “සබැඳිවල චාප ඉදිරිපත් කිරීම්. ඒකාකාරී සරල කිරීම ”, 2004 . නොකැඩූ ඕනෑම සෘජුකෝණාස්රාකාර රූප සටහනකින්, සුළු රූපසටහනෙන් අවසන් වන චලනයන් සරල කිරීමේ අනුපිළිවෙලක් ඇති බව ඩයිනිකොව් ඔප්පු කළේය. කෙටියෙන්, අවසර ලත් පියවරයන්ට ඇතුළත් වන්නේ:
- සිරස් (හෝ තිරස්) කොටස් චක්රීයව අවසර දීම;
- නිශ්චිත වින්යාස සීමාවන් යටතේ අඛණ්ඩ සිරස් (හෝ තිරස්) කොටස් මාරු කිරීම.
- රූප සටහනේ කෙළවරේ පිහිටා ඇති යාබද සිරස් තුනක් එක් ශීර්ෂයකින් ආදේශ කිරීම.
පින්තූර සඳහා කඩදාසි බලන්න. මෙය පැහැදිලි ප්රමේයයක් නොවේ; ඒ වෙනුවට හරස් මාර්ග ගණන වැඩි නොකරන රයිඩමිස්ටර් චලනයන් භාවිතා කරන්නේ නම් එය නොපවතී. නමුත් ඉහත සඳහන් කළ සරල කිරීම් සඳහා එය සත්යයක් බවට පත්වේ.
(අපි ක්රියාත්මක කිරීම සරල කරන්නේ සිරස් කොටස් වලට පමණක් අවසර දීම පමණක් නොව, සම්පූර්ණ ගැටය සිරස් අතට තිරස් අතට හුවමාරු කර ගැනීමට ඉඩ සලසමිනි.)
නිරූපණය
$ python3 knot.py <<EOF
+-------+ +-------+
| | | |
| +---|----+ +-------+
| | | | | |
+-------|------------|---+
| | | |
+---+ +---+
EOF
KNOT
$ python3 knot.py <<EOF
+----------+
| |
| +--------------+
| | | |
| | +-|----+ |
| | | | | |
| +-----+ | |
| | | |
| +------|---+
| |
+---------------+
EOF
NOT
$ python3 knot.py <<EOF # the Culprit
+-----+
| |
+-----------+ |
| | | |
| +-+ | +---|-+
| | | | | | | |
| +-|-------+ | |
| | | | | | | |
+-|-+ | | +---+ |
| | | |
+---|---------+
| |
+-+
EOF
NOT
$ python3 knot.py <<EOF # Ochiai unknot
+-----+
| |
+-|---------+
| | | |
| | +-+ | |
| | | | | |
+-|-|---|-|-+ |
| | | | | | | |
| | | +---|---+
| | | | | |
+-------+ | |
| | | |
| +-------+
| |
+-------+
EOF
NOT
$ python3 knot.py <<EOF # Ochiai unknot plus trefoil
+-----+ +-----+
| | | |
+-|---------+ |
| | | | | |
| | +-+ | +---+ |
| | | | | | | |
+-|-|---|-|-+ +---+
| | | | | | | |
| | | +---|-----+
| | | | | |
+-------+ | |
| | | |
| +-------+
| |
+-------+
EOF
KNOT
$ python3 knot.py <<EOF # Thistlethwaite unknot
+---------+
| |
+---+ +---------+
| | | | | |
| +-------+ | |
| | | | | |
| | | +---+ |
| | | | | |
| | +-------+ |
| | | | | |
| +-------+ | |
| | | | | |
+-----------+ | | | |
| | | | | |
| +-----------+ | | |
| | | | | |
| | +-------------+ |
| | | |
| | +-----+
| | | |
| | +---+
| | | |
+---------------------+ |
| |
+---------------------+
EOF
NOT
$ python3 knot.py <<EOF # (−3,5,7)-pretzel knot
+-------------+
| |
+-|-----+ |
| | | |
+-|-+ +-------+ |
| | | | | |
+-|-+ +---+ +---+
| | | | | |
| | +---+ +---+
| | | | | |
| | +---+ +---+
| | | | | |
| +---+ +---+
| | | |
| | +---+
| | | |
| | +---+
| | | |
| +---+
| |
+-----+
EOF
KNOT
$ python3 knot.py <<EOF # Gordian unknot
+-------------+ +-------------+
| | | |
| +---------+ | | +---------+ |
| | | | | | | |
| | +-------------+ +-------------+ | |
| | | | | | | | | | | |
| | | +---------+ | | +---------+ | | |
| | | | | | | | | | | | | | | |
| +-------+ | +-------+ +-------+ | +-------+ |
| | | | | | | | | | | | | | | |
+-------+ | +-------+ | | +-------+ | +-------+
| | | | | | | | | | | | | | | |
| +-------+ | | | | | | | | +-------+ |
| | | | | | | | | | | | | | | |
+-------+ | | | | | | | | | | +-------+
| | | | | | | | | | | | | | | |
| +-----+ | | | | | | +-----+ |
| | | | | | | | | | | |
+---------+ | | | | +---------+
| | | | | | | |
+---------+ | | +---------+
| | | | | | | |
| | +-----------------+ | |
| | | | | |
| +---------------------+ |
| | | |
+-----------+ +-----------+
EOF
NOT