示例#1
0
        public int DancingLinks(bool justOne, AnswerCallback cb)
        {
            ansCallback = cb;
            IntPtr callback = Marshal.GetFunctionPointerForDelegate(new SudokuLib.AnswerCallback(DancingCallback));

            return(SudokuLib.DancingLinks(matrix, (byte)(justOne ? 1 : 0), callback, IntPtr.Zero));
        }
示例#2
0
        public Sudoku(SudokuReadData readFunc, SudokuWriteData writeFunc, SolveProcessCallback procCallback)
        {
            if (readFunc == null || writeFunc == null)
            {
                throw new Exception("read function and write function should not be null!");
            }
            IntPtr readPtr = Marshal.GetFunctionPointerForDelegate(new SudokuLib.SudokuReadData((IntPtr data, int row, int col) =>
            {
                return(readFunc.Invoke(row, col));
            }));
            IntPtr writePtr = Marshal.GetFunctionPointerForDelegate(new SudokuLib.SudokuWriteData((IntPtr data, int row, int col, int value, int type) =>
            {
                writeFunc.Invoke(row, col, value, (SolveType)type);
            }));
            IntPtr solvePtr = Marshal.GetFunctionPointerForDelegate(new SudokuLib.SolveProcessCallback((IntPtr data, IntPtr proc) =>
            {
                if (procCallback == null)
                {
                    return;
                }
                SolveProcedure procedure = (SolveProcedure)Marshal.PtrToStructure(proc, typeof(SolveProcedure));
                procCallback.Invoke(procedure);
            }));

            sudo = SudokuLib.CreateSudoku(readPtr, writePtr, solvePtr, IntPtr.Zero);
        }
示例#3
0
        public void SetMatrixRowData(int[] data)
        {
            IntPtr pData = Marshal.AllocHGlobal(sizeof(int) * data.Length);

            Marshal.Copy(data, 0, pData, data.Length);
            SudokuLib.SetMatrixRowData(matrix, pData, data.Length);
            Marshal.FreeHGlobal(pData);
        }
示例#4
0
        public string MakeResultString()
        {
            IntPtr pData = Marshal.AllocHGlobal(SudokuLib.RESULT_BUFFER_SIZE);

            SudokuLib.MakeResultString(sudo, pData, SudokuLib.RESULT_BUFFER_SIZE);
            string result = Marshal.PtrToStringAnsi(pData, SudokuLib.RESULT_BUFFER_SIZE);

            Marshal.FreeHGlobal(pData);
            return(result);
        }
示例#5
0
        public static bool VerifySudokuBoard(int[] board)
        {
            if (board.Length < SudokuLib.BOARD_SIZE)
            {
                return(false);
            }
            IntPtr pData = Marshal.AllocHGlobal(sizeof(int) * board.Length);

            Marshal.Copy(board, 0, pData, board.Length);
            int ret = (int)SudokuLib.VerifySudokuBoard(pData);

            Marshal.FreeHGlobal(pData);
            return(ret > 0);
        }
示例#6
0
        public int CalculateSudokuAll(bool dancing, SudokuAnswerCallback cb)
        {
            IntPtr ansPtr = Marshal.GetFunctionPointerForDelegate(new SudokuLib.AnswerCallback((IntPtr data, IntPtr answer, int size) =>
            {
                if (cb == null)
                {
                    return;
                }
                string result = Marshal.PtrToStringAnsi(answer, size);
                cb.Invoke(result);
            }));

            return(SudokuLib.CalculateSudokuAll(sudo, (byte)(dancing ? 1 : 0), ansPtr, IntPtr.Zero));
        }
示例#7
0
 public BoolMatrix(int rows, int cols, int maxNodes)
 {
     matrix = SudokuLib.CreateBoolMatrix(rows, cols, maxNodes);
 }
示例#8
0
 public int GetKnownCount()
 {
     return(SudokuLib.GetKnownCount(sudo));
 }
示例#9
0
 public bool VerifySudoku()
 {
     return(SudokuLib.VerifySudoku(sudo) > 0);
 }
示例#10
0
        public static string ImproveTypeName(ImproveType type)
        {
            IntPtr name = SudokuLib.ImproveTypeName((int)type);

            return(Marshal.PtrToStringAnsi(name));
        }