Beispiel #1
0
        //create candidates for multithreading.
        private List<Board> createCandidates()
        {
            List<Board> candidates = new List<Board>();

            for(int i = 0; i < gridSize; i++)
            {
                for(int j = 0; j < gridSize; j++)
                {
                    if(originalBoard.getBoard(i, j) == 0)
                    {
                        for(int k = 1; k <= gridSize; k++)
                        {
                            Board candy = originalBoard.Copy();
                            candy.setBoard(i, j, k);
                            if (candy.isValid())
                            {
                                candidates.Add(candy);
                            }
                        }
                        i = gridSize;
                        break;
                    }
                }
            }

            return candidates;
        }
Beispiel #2
0
        private BoardCozum CozVeOrtalamaDondur(Board board, ISolver solver, int denemeSayisi, string metrik, bool ilkiniAl = true)
        {
            long         total          = 0;
            int          deneme         = 0;
            List <Board> SolutionBoards = new List <Board>();
            string       detail         = "";

            for (int i = 0; i < denemeSayisi; i++)
            {
                Board     copy      = board.Copy();
                Stopwatch stopwatch = new Stopwatch();
                stopwatch.Start();
                Board aSolutionBoard = solver.Solve(copy);
                SolutionBoards.Add(aSolutionBoard);
                stopwatch.Stop();
                solver.Temizle();
                long gecen = metrik.Equals("ms") ? stopwatch.ElapsedMilliseconds : stopwatch.ElapsedTicks;
                detail += gecen + ",";
                if (!ilkiniAl && i == 0)
                {
                    continue;
                }
                deneme++;
                total += gecen;
            }
            double avg = ((double)total) / deneme;

            return(new BoardCozum
            {
                Total = total,
                Detail = detail.Remove(detail.Length - 1),
                CozumBoards = SolutionBoards,
                Sure = avg
            });
        }
Beispiel #3
0
        /// <summary>
        /// Tries to solve the board
        /// </summary>
        /// <returns>A new instance of Board if solved otherwise null</returns>
        public Board Solve()
        {
            List <int>[,] possibleValues = FindValidValues(_currentBoard);

            Board copiedBoard = _currentBoard.Copy();

            _currentBoard = copiedBoard;
            if (Solve(possibleValues))
            {
                return(copiedBoard);
            }

            return(null);
        }
Beispiel #4
0
        public Generator(int size)
        {
            string init = "";

            for (int i = 0; i < size; i++)
            {
                for (int j = 0; j < size; j++)
                {
                    init += "0 ";
                }
            }
            initBoard = new Sudoku.Board(init);
            newBoard  = initBoard.Copy();
            gridSize  = size;
        }
Beispiel #5
0
 public Solver(Board b)
 {
     originalBoard = b.Copy();
     solution = b.Copy();
     gridSize = originalBoard.gridSize;
 }
Beispiel #6
0
        public string generateString(int holeNumber)
        // generate n boards...
        {
            int NUM_MAX = gridSize * 3 - 6; // number of random generated numbers

            status = 0;
            List <int> selected = new List <int>();
            Random     r        = new Random();
            bool       solved   = false;

            //lasvegas algorithms.
            do // while bm has a solution
            {
                sv = null;
                do // while newBoard got valid puzzle
                {
                    int numberSelect = NUM_MAX;
                    selected.Clear();
                    newBoard = initBoard.Copy();
                    while (numberSelect > 0)
                    {
                        int inputPosition = r.Next(1, gridSize * gridSize);
                        if (!selected.Contains(inputPosition))
                        {
                            selected.Add(inputPosition);
                            newBoard.setBoard(inputPosition / gridSize, inputPosition % gridSize, r.Next(1, gridSize));
                            numberSelect--;
                        }
                    }
                }while (!newBoard.isValid());
                sv = new Solver(newBoard);
                sv.PresentBoard += PresentBoard;
                bool DONE = false;
                var  t0   = new System.Threading.Thread(() => {
                    threeseconds();
                    if (DONE == false)
                    {
                        sv.killSolver();
                        DONE = true;
                    }
                });
                var t1 = new System.Threading.Thread(() =>
                {
                    solved = sv.solve(2, true);
                    Console.WriteLine("solved in three seconds...");
                    DONE = true;
                });
                t0.Start();
                t1.Start();
                while (!DONE)
                {
                    System.Threading.Thread.Sleep(200);
                }
                t0.Abort();
                t1.Abort();
            }while (!solved);

            Console.WriteLine("digging hole initiated");
            status = 1; // DO NOT PRESENT WHILE THIS REGION

            Board Digged = sv.solution.Copy();

            bool[,] DONOTDIG = new bool[gridSize, gridSize];
            //holeNumber = r.Next(54, 73); // 9x9 Normal difficulty (temporal), we should implement difficulty later
            sv = null;
            int[] shuffledArr = new int[gridSize * gridSize];

            for (int i = 0; i < gridSize * gridSize; i++)
            {
                DONOTDIG[i / gridSize, i % gridSize] = false;
                shuffledArr[i] = i;
            }

            // shuffling size array...
            int n = shuffledArr.Length;

            while (n > 1)
            {
                int k    = r.Next(n--);
                int temp = shuffledArr[n];
                shuffledArr[n] = shuffledArr[k];
                shuffledArr[k] = temp;
            }

            //lets dig holes!
            int cnt = gridSize * gridSize - 1;

            while (holeNumber > 0)
            {
                if (cnt == 0)
                {
                    break;
                }
                int digRow       = shuffledArr[cnt] / gridSize;
                int digCol       = shuffledArr[cnt--] % gridSize;
                int diggedNumber = Digged.getBoard(digRow, digCol);

                if (DONOTDIG[digRow, digCol])
                {
                    continue;
                }

                bool nope = false;
                holeNumber--;
                for (int i = 1; i <= gridSize; i++)
                {
                    if (i == diggedNumber)
                    {
                        continue;
                    }
                    Digged.setBoard(digRow, digCol, i);
                    sv = new Solver(Digged);
                    if (sv.solve(2, true))
                    {
                        DONOTDIG[digRow, digCol] = true;
                        Digged.setBoard(digRow, digCol, diggedNumber);
                        nope = true;
                        holeNumber++;
                        break;
                    }
                }
                if (!nope)
                {
                    DONOTDIG[digRow, digCol] = true;
                    //Console.WriteLine("digging #{0}: {1}, {2}", holeNumber, digRow, digCol);
                    Digged.setBoard(digRow, digCol, 0);
                    newBoard = Digged.Copy();
                }
            }
            SolBoard = Digged.Copy();
            Console.WriteLine("generating complete");
            Console.WriteLine(Digged.ToString());
            PresentBoard(this, new PresentBoardArgs(Digged.ToString()));
            return(Digged.ToString());
        }