From: John L. <jr...@us...> - 2007-06-26 03:22:12
|
Update of /cvsroot/wxlua/wxLua/samples In directory sc8-pr-cvs9.sourceforge.net:/tmp/cvs-serv15715/wxLua/samples Modified Files: wxluasudoku.wx.lua Log Message: Added more classes Updated lua 5.1.2 with patches 1-6 Made wxluasudoku a little faster Index: wxluasudoku.wx.lua =================================================================== RCS file: /cvsroot/wxlua/wxLua/samples/wxluasudoku.wx.lua,v retrieving revision 1.71 retrieving revision 1.72 diff -C2 -d -r1.71 -r1.72 *** wxluasudoku.wx.lua 14 Jun 2007 01:23:20 -0000 1.71 --- wxluasudoku.wx.lua 26 Jun 2007 03:22:07 -0000 1.72 *************** *** 406,409 **** --- 406,437 ---- end + + -- Generate a table of {[cell] = {hash table of cells that are in the row, col, block of this cell}} + sudoku.cellToRowColBlockCellsTable = {} + for cell = 1, 81 do + local row, col = sudoku.CellToRowCol(cell) + local block_cell = sudoku.BlockToCell(sudoku.CellToBlock(cell)) + + sudoku.cellToRowColBlockCellsTable[cell] = {} + + for rcb = 1, 9 do + local c = sudoku.RowColToCell(rcb, col) + sudoku.cellToRowColBlockCellsTable[cell][c] = true + c = sudoku.RowColToCell(row, rcb) + sudoku.cellToRowColBlockCellsTable[cell][c] = true + c = rcb + block_cell + sudoku.LinearBlockCellTable[rcb] + sudoku.cellToRowColBlockCellsTable[cell][c] = true + end + end + + -- Generate a table of {[cell] = {array of cells that are in the row, col, block of this cell}} + sudoku.cellToRowColBlockCellsArray = {} + for cell = 1, 81 do + sudoku.cellToRowColBlockCellsArray[cell] = {} + for k, v in pairs(sudoku.cellToRowColBlockCellsTable) do + table.insert(sudoku.cellToRowColBlockCellsArray, k) + end + end + -- ============================================================================ -- Get the cell value at a specific row, col *************** *** 585,617 **** end function sudoku.RemoveCellPossible(cell, value, sudokuTable) ! if sudokuTable.possible[cell][value] then ! sudokuTable.possible[cell][value] = nil ! end end -- Remove a possible values from the row, col, block. Modifies input sudokuTable. -- if exceptTable then don't remove it from exceptTable[cell#] = true ! function sudoku.RemovePossibleAll(row, col, value, sudokuTable, exceptTable, break_if_empty) exceptTable = exceptTable or {} break_if_empty = break_if_empty or false - local block_cell = sudoku.BlockToCell(sudoku.RowColToBlock(row, col)) - - for rcb = 1, 9 do - local cell = sudoku.RowColToCell(rcb, col) - if (not exceptTable[cell]) and sudokuTable.possible[cell][value] then - sudokuTable.possible[cell][value] = nil - if break_if_empty and (not sudoku.HasCellValue(cell, sudokuTable)) and TableIsEmpty(sudokuTable.possible[cell]) then return nil end - end - - cell = sudoku.RowColToCell(row, rcb) - if (not exceptTable[cell]) and sudokuTable.possible[cell][value] then - sudokuTable.possible[cell][value] = nil - if break_if_empty and (not sudoku.HasCellValue(cell, sudokuTable)) and TableIsEmpty(sudokuTable.possible[cell]) then return nil end - end ! cell = rcb + block_cell + sudoku.LinearBlockCellTable[rcb] ! if (not exceptTable[cell]) and sudokuTable.possible[cell][value] then ! sudokuTable.possible[cell][value] = nil ! if break_if_empty and (not sudoku.HasCellValue(cell, sudokuTable)) and TableIsEmpty(sudokuTable.possible[cell]) then return nil end end end --- 613,629 ---- end function sudoku.RemoveCellPossible(cell, value, sudokuTable) ! sudokuTable.possible[cell][value] = nil end -- Remove a possible values from the row, col, block. Modifies input sudokuTable. -- if exceptTable then don't remove it from exceptTable[cell#] = true ! function sudoku.RemovePossibleAll(cell, value, sudokuTable, exceptTable, break_if_empty) exceptTable = exceptTable or {} break_if_empty = break_if_empty or false ! for i, c in ipairs(sudoku.cellToRowColBlockCellsArray[cell]) do ! if (not exceptTable[c]) and sudokuTable.possible[c][value] then ! sudokuTable.possible[c][value] = nil ! if break_if_empty and (not sudoku.HasCellValue(c, sudokuTable)) and TableIsEmpty(sudokuTable.possible[c]) then return nil end end end *************** *** 1064,1070 **** end if count == 1 then sudoku.SetValue(row, col, value, sudokuTable) ! sudoku.RemovePossibleAll(row, col, value, sudokuTable) ! changed_cells[sudoku.RowColToCell(row, col)] = value end end --- 1076,1083 ---- end if count == 1 then + local cell = sudoku.RowColToCell(row, col) sudoku.SetValue(row, col, value, sudokuTable) ! sudoku.RemovePossibleAll(cell, value, sudokuTable) ! changed_cells[cell] = value end end *************** *** 1115,1121 **** if TableCount(possible[value]) == 1 then local cell = possible[value][1] ! local r, c = sudoku.CellToRowCol(cell) ! sudoku.SetValue(r, c, value, sudokuTable) ! sudoku.RemovePossibleAll(r, c, value, sudokuTable) changed_cells[cell] = value end --- 1128,1133 ---- if TableCount(possible[value]) == 1 then local cell = possible[value][1] ! sudoku.SetCellValue(cell, value, sudokuTable) ! sudoku.RemovePossibleAll(cell, value, sudokuTable) changed_cells[cell] = value end *************** *** 1156,1162 **** if TableCount(possible[value]) == 1 then local cell = possible[value][1] ! local row, col = sudoku.CellToRowCol(cell) ! sudoku.SetValue(row, col, value, sudokuTable) ! sudoku.RemovePossibleAll(row, col, value, sudokuTable) changed_cells[cell] = value end --- 1168,1173 ---- if TableCount(possible[value]) == 1 then local cell = possible[value][1] ! sudoku.SetCellValue(cell, value, sudokuTable) ! sudoku.RemovePossibleAll(cell, value, sudokuTable) changed_cells[cell] = value end *************** *** 1265,1270 **** -- don't use SetValue since we only care about possible s1.values[cell] = k --sudoku.SetValue(row, col, k, s1) ! local row, col = sudoku.CellToRowCol(cell) ! sudoku.RemovePossibleAll(row, col, k, s1, nil, true) guesses[cell] = guesses[cell] + 1 --- 1276,1280 ---- -- don't use SetValue since we only care about possible s1.values[cell] = k --sudoku.SetValue(row, col, k, s1) ! sudoku.RemovePossibleAll(cell, k, s1, nil, true) guesses[cell] = guesses[cell] + 1 *************** *** 1352,1356 **** if sudoku.IsValidValue(row, col, value, sudokuTable) then sudoku.SetCellValue(cell, value, sudokuTable) ! sudoku.RemovePossibleAll(row, col, value, sudokuTable) else -- try other values starting at value+1 and wrapping around --- 1362,1366 ---- if sudoku.IsValidValue(row, col, value, sudokuTable) then sudoku.SetCellValue(cell, value, sudokuTable) ! sudoku.RemovePossibleAll(cell, value, sudokuTable) else -- try other values starting at value+1 and wrapping around *************** *** 1361,1365 **** if sudoku.IsValidValue(row, col, i, sudokuTable) then sudoku.SetCellValue(cell, i, sudokuTable) ! sudoku.RemovePossibleAll(row, col, i, sudokuTable) set_value = true break --- 1371,1375 ---- if sudoku.IsValidValue(row, col, i, sudokuTable) then sudoku.SetCellValue(cell, i, sudokuTable) ! sudoku.RemovePossibleAll(cell, i, sudokuTable) set_value = true break |