Та някой да знае как се решава судоку. И най вече как се реализира програмно? Тъпото е, че ще трябва да го правя на Autohotkey, където по принцип не се поддържат масиви. Другият вариант е ако е на C++ или Basic или изобщо език, на който да се създаде dll файл, който да се извиква. Но това са незначителни подробности. Мен ме мъчи алгоритъма :) Bruteforce-a е с неприемливо дълъг период на решаване :)
Sudoku( p ) { ;ErrorLevel contains the number of iterations p := RegExReplace(p, "[^1-9@]"), ErrorLevel := 0 ;format puzzle as single line string return Sudoku_Display(Sudoku_Solve(p)) }
Sudoku_Solve( p, d = 0 ) { ;d is 0-based ; http://www.autohotkey.com/forum/topic46679.html ; p: 81 character puzzle string ; (concat all 9 rows of 9 chars each) ; givens represented as chars 1-9 ; fill-ins as any non-null, non 1-9 char ; d: used internally. omit on initial call ; ; returns: 81 char string with non-givens replaced with valid solution ; If (d >= 81), ErrorLevel++ return p ;this is 82nd iteration, so it has successfully finished iteration 81 If InStr( "123456789", SubStr(p, d+1, 1) ) ;this depth is a given, skip through return Sudoku_Solve(p, d+1) m := Sudoku_Constraints(p,d) ;a string of this level's constraints. ; (these will not change for all 9 loops) Loop 9 { If InStr(m, A_Index) Continue NumPut(Asc(A_Index), p, d, "Char") If r := Sudoku_Solve(p, d+1) return r } return 0 }
Sudoku_Constraints( ByRef p, d ) { ; returns a string of the constraints for a particular position c := Mod(d,9) , r := (d - c) // 9 , b := r//3*27 + c//3*3 + 1 ;convert to 1-based , c++ return "" ; row: . SubStr(p, r * 9 + 1, 9) ; column: . SubStr(p,c ,1) SubStr(p,c+9 ,1) SubStr(p,c+18,1) . SubStr(p,c+27,1) SubStr(p,c+36,1) SubStr(p,c+45,1) . SubStr(p,c+54,1) SubStr(p,c+63,1) SubStr(p,c+72,1) ;box . SubStr(p, b, 3) SubStr(p, b+9, 3) SubStr(p, b+18, 3) }
Sudoku_Display( p ) { If StrLen(p) = 81 loop 81 r .= SubStr(p, A_Index, 1) . "|" return r }
Точно с това си троша зъбите. При мен резултата е едни йероглифи в първата половина и без промяна във втората половина на уж крайния резултат. Имам чувството, че NumPut функцията ми играе лоша шега...
Хм....... Гледам судокуто направо го написахте, пренаписахте го, (аман от разбирачи), а "уловката" на DIMIVA никой не успя да разкрие! Аман от разбирачи! И за кво ми е туй судоку, като мобилния си ми го има? Играя си го всеки ден без ангажимент да влизам където и да е, да зачерквам каквото и да е, и да купувам което и да е?!
Идеята може би е да съставите машина, която да ви даде отговорите на судоку! А то е същото като да напишеш едно судоку! Ти наистина ли ме питаш каква е идеята?
Това с телефоните беше забавно :) А иначе на мен ми трябваше за следното нещо- от момента на появяване на судоку-то в заредената страница до момента в който судокуто да бъде попълнено да мине минимално време. Разбира се има доста online услуги за решаване на судоку, но да се препишат числата ръчно например минава доста време и често води до грешки.
А иначе програмата ми е готова. Темата се получи интересна и полезна, за което благодаря на включилите се. -------------------------------------------------------------------------------- -Всеки човек има определен хоризонт. Когато той се свива и стане безкрайно малък, се превръща в точка. Тогава човекът казва: "Това е моята гледна точка".