AlmarM Posted September 10, 2010 Posted September 10, 2010 (edited) EDIT:Ugh, I give up.Could anyone help me convert this into AU3?This is what I came up with.expandcollapse popup#include <Array.au3> Dim $aPuzzle[81] = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] Solve($aPuzzle) Func ReturnRow($iCell) Return Floor($iCell / 9) EndFunc Func ReturnCol($iCell) Return Mod($iCell, 9) EndFunc Func ReturnBlock($iCell) Return Floor(ReturnRow($iCell) / 3) * 3 + Floor(ReturnCol($iCell) / 3) EndFunc Func IsPossibleRow($iNumber, $iRow, ByRef $aSudoku) Local $bPossible = True For $i = 0 To 8 If ($aSudoku[$iRow * 9 + $i] == $iNumber) Then $bPossible = False ExitLoop EndIf Next Return $bPossible EndFunc Func IsPossibleCol($iNumber, $iCol, ByRef $aSudoku) Local $bPossible = True For $i = 0 To 8 If ($aSudoku[$iCol * 9 + $i] == $iNumber) Then $bPossible = False ExitLoop EndIf Next Return $bPossible EndFunc Func IsPossibleBlock($iNumber, $iBlock, ByRef $aSudoku) Local $bPossible = True For $i = 0 To 8 If ($aSudoku[Floor($iBlock / 3) * 27 + Mod($i, 3) + 9 * Floor($i / 3) + 3 * Mod($iBlock, 3) == $iNumber]) Then $bPossible = False ExitLoop EndIf Next Return $bPossible EndFunc Func IsPossibleNumber($iCell, $iNumber, ByRef $aSudoku) Local $iRow = ReturnRow($iCell) Local $iCol = ReturnCol($iCell) Local $iBlock = ReturnBlock($iCell) Return IsPossibleRow($iNumber, $iRow, $aSudoku) And IsPossibleCol($iNumber, $iCol, $aSudoku) And IsPossibleBlock($iNumber, $iBlock, $aSudoku) EndFunc Func IsCorrectRow($iRow, ByRef $aSudoku) Local $aSequence[9] = [1, 2, 3, 4, 5, 6, 7, 8, 9] Local $aTempRow[9] For $i = 0 To 8 $aTempRow[$i] = $aSudoku[$iRow * 9 + $i] Next _ArraySort($aTempRow) $sArray = _ArrayToString($aTempRow, ",") $sArray2 = _ArrayToString($aSequence, ",") Return $sArray == $sArray2 EndFunc Func IsCorrectCol($iCol, ByRef $aSudoku) Local $aSequence[9] = [1, 2, 3, 4, 5, 6, 7, 8, 9] Local $aTempCol[9] For $i = 0 To 8 $aTempCol[$i] = $aSudoku[$iCol + $i * 9] Next _ArraySort($aTempCol) $sArray = _ArrayToString($aTempCol, ",") $sArray2 = _ArrayToString($aSequence, ",") Return $sArray == $sArray2 EndFunc Func IsCorrectBlock($iBlock, ByRef $aSudoku) Local $aSequence[9] = [1, 2, 3, 4, 5, 6, 7, 8, 9] Local $aTempBlock[9] For $i = 0 To 8 $aTempBlock[$i] = $aSudoku[Floor($iBlock / 3) * 27 + Mod($i, 3) + 9 * Floor($i / 3) + 3 * Mod($iBlock, 3)] Next _ArraySort($aTempBlock) $sArray = _ArrayToString($aTempBlock, ",") $sArray2 = _ArrayToString($aSequence, ",") Return $sArray == $sArray2 EndFunc Func IsSolved(ByRef $aSudoku) For $i = 0 To 8 If (Not IsCorrectBlock($i, $aSudoku) Or Not IsCorrectRow($i, $aSudoku) Or Not IsCorrectCol($i, $aSudoku)) Then Return False EndIf Next Return True EndFunc Func DeterminePossibleValues($iCell, ByRef $aSudoku) Local $aPossible[9] For $i = 1 To 9 If (IsPossibleNumber($iCell, $i, $aSudoku)) Then _ArrayPush($aPossible, $i, 1) EndIf Next Return $aPossible EndFunc Func DetermineRandomPossibleValue($aPossible, $iCell) Local $iRandomPicked = Floor(Random() * StringLen($aPossible[$iCell]) Return $aPossible[$iCell][$iRandomPicked] EndFunc Func ScanForUnique(ByRef $aSudoku) Local $aPossible[81][1] For $i = 0 To 80 If ($aSudoku[$i] == 0) Then $aPossible[$i][0] = DeterminePossibleValues($i, $aSudoku) If (StringLen($aPossible[$i][0]) == 0) Then Return False EndIf EndIf Next Return $aPossible EndFunc Func RemoveAttempt($aAttempt, $iNumber) Local $aTempArray[UBound($aAttempt)] For $i = 0 To UBound($aAttempt) - 1 If ($aAttempt[$i] <> $iNumber) Then _ArrayPush($aTempArray, $aAttempt[$i], 1) EndIf Next Return $aTempArray EndFunc Func NextRandom($aPossible) Local $iMai = 9 Local $iMinChoices = 0 For $i = 0 To 80 If ($aPossible[$i] <> "") Then If ((StringLen($aPossible[$i][0]) <= $iMai) And (StringLen($aPossible[$i][0]) > 0) Then $iMai = StringLen($aPossible[$i]) $iMinChoices = $i EndIf EndIf Next Return $iMinChoices EndFunc Func Solve(ByRef $aSudoku) Local $aSaved[47] Local $aSavedSud[47] Local $i = 0 Local $vNextMove Local $iWhatToTry Local $aAttempt While (Not IsSolved($aSudoku)) $i += 1 $vNextMove = ScanForUnique($aSudoku) If ($vNextMove == False) Then $vNextMove = _ArrayPop($aSaved) $aSudoku = _ArrayPop($aSavedSud) EndIf $iWhatToTry = NextRandom($vNextMove) $aAttempt = DetermineRandomPossibleValue($vNextMove, $iWhatToTry) If (StringLen($vNextMove[$iWhatToTry]) > 1) Then $vNextMove[$iWhatToTry] = RemoveAttempt($vNextMove[$iWhatToTry], $aAttempt) ; ; EndIf $aSudoku[$iWhatToTry] = $aAttempt WEnd _ArrayDisplay($aSudoku) EndFunc Edited September 10, 2010 by AlmarM Minesweeper A minesweeper game created in autoit, source available. _Mouse_UDF An UDF for registering functions to mouse events, made in pure autoit. 2D Hitbox Editor A 2D hitbox editor for quick creation of 2D sphere and rectangle hitboxes.
exodius Posted September 10, 2010 Posted September 10, 2010 Does this help? http://www.autoitscript.com/forum/index.php?showtopic=98002
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now