Example #1
0
 void AddBoardToSolve(SolverBoard b, int x, int y, int _parent)
 {
     statesByLevel[nextLevel].Add(new BoardState {
         move   = new Vector2(x, y),
         board  = b,
         parent = _parent
     });
 }
Example #2
0
    public SolverBoard(SolverBoard _board)
    {
        matrix = new bool[_board.matrix.Length];
        for(int i = 0 ; i < _board.matrix.Length ; matrix[i]=_board.matrix[i++]);

        width = height = Mathf.CeilToInt(Mathf.Sqrt(matrix.Length));

        minX = 0;
        minY = 0;
        maxX = width;
        maxY = height;

        UpdateLimits();
    }
Example #3
0
    public SolverBoard(SolverBoard _board)
    {
        matrix = new bool[_board.matrix.Length];
        for (int i = 0; i < _board.matrix.Length; matrix[i] = _board.matrix[i++])
        {
            ;
        }

        width = height = Mathf.CeilToInt(Mathf.Sqrt(matrix.Length));

        minX = 0;
        minY = 0;
        maxX = width;
        maxY = height;

        UpdateLimits();
    }
Example #4
0
    public static bool Compare(SolverBoard b1, SolverBoard b2)
    {
        if(b1.matrix.Length != b2.matrix.Length)
            return false;

        if(b1.minX != b2.minX ||
           b1.minY != b2.minY ||
           b1.maxX != b2.maxX ||
           b1.maxY != b2.maxY )
            return false;

        for(int i = 0 ; i < b1.matrix.Length ; ++i){
            if(b1.matrix[i] != b2.matrix[i]){
                return false;
            }
        }
        return true;
    }
Example #5
0
    public static bool Compare(SolverBoard b1, SolverBoard b2)
    {
        if (b1.matrix.Length != b2.matrix.Length)
        {
            return(false);
        }

        if (b1.minX != b2.minX ||
            b1.minY != b2.minY ||
            b1.maxX != b2.maxX ||
            b1.maxY != b2.maxY)
        {
            return(false);
        }

        for (int i = 0; i < b1.matrix.Length; ++i)
        {
            if (b1.matrix[i] != b2.matrix[i])
            {
                return(false);
            }
        }
        return(true);
    }
Example #6
0
 void AddBoardToSolve(SolverBoard b, int x, int y, int _parent)
 {
     statesByLevel[nextLevel].Add(new BoardState{
         move = new Vector2(x,y),
         board = b,
         parent = _parent
     });
 }
Example #7
0
    // Use this for initialization
    void Start()
    {
        //		string m = "1000000011100001100100000000000010100000011000001000010001110010";//8x8
        string m = "001101110010010100101100001000000010";//6x6
        //		string m = "1110000101100100";//4x4
        SolverBoard b = new SolverBoard(m);

        Debug.Log(b.ToString());

        SolverClass solver = new SolverClass(m);
        //		List<Thread> threads = new List<Thread>();

        List<SolverClass> solvers = new List<SolverClass>();
        ManualResetEvent[] doneEvents = new ManualResetEvent[m.Length];

        int ac = 0;
        for(int x = 0 ; x < solver.length ; ++x){
            for(int y = 0 ; y < solver.length ; ++y){
                b.ApplyMove(x,y);

                doneEvents[ac] = new ManualResetEvent(false);

                solvers.Add(new SolverClass(b.matrix_str, doneEvents[ac]));

        //				threads.Add(new Thread(() => solvers[solvers.Count-1].Solve()));

                ThreadPool.QueueUserWorkItem((object a)=>solvers[solvers.Count-1].Solve(0));

                ac++;
            }
        }

        bool waitALittleMore = false;

        int min = 1000000;

        do{
            WaitHandle.WaitAll(doneEvents);

            for(int i = 0 ; i < solvers.Count ; ++i){
                if(solvers[i].solved){
                    if(solvers[i].minMoves < min){
                        min = solvers[i].minMoves;
        //						solvers[i].
                    }
                }
            }

            waitALittleMore = false;

            for(int i = 0 ; i < solvers.Count && !waitALittleMore ; ++i){
                if(solvers[i].statesByLevel.Count -1 < min){
                    waitALittleMore = true;
                }
            }
        }while(waitALittleMore);

        for(int i = 0 ; i < solvers.Count ; ++i){
            solvers[i].externalSolved = true;
        }

        Debug.Log("Ended");
        Debug.Log("Min = " + min);
    }
Example #8
0
    public void SolveCurrentBoard(SolverBoard currentBoard, int b)
    {
        for(int x = currentBoard.minX; x < currentBoard.maxX; ++x) {
            for(int y = currentBoard.minY; y < currentBoard.maxY; ++y) {
                SolverBoard aux = new SolverBoard(currentBoard);

                aux.ApplyMove(x,y);

                if(statesByLevel.Count > 2){
                    //int grandFather = statesByLevel[currentLevel][b].parent
                    bool exist = false;
                    for(int i = 0 ; i < statesByLevel.Count-1 && !exist ; ++i){
                        for(int j = 0 ; j < statesByLevel[i].Count && !exist ; ++j){
                            if(SolverBoard.Compare(aux, statesByLevel[i][j].board))
                                exist = true;
                        }
                    }

                    if(!exist)
                        AddBoardToSolve(aux, x, y, b);
                }
                else{
                    AddBoardToSolve(aux, x, y, b);
                }

                //						AddBoardToSolve(aux, x, y, b);

                if(aux.solved){
                    //PUZZLE SOLVED!!!
                    solved = true;

                    minMoves = statesByLevel.Count -1;

                    BoardState b2 = statesByLevel[nextLevel][statesByLevel[nextLevel].Count-1];
                    int level = minMoves;

                    while (b2.parent != -1){
                        solution = "(" + b2.move.x + "," + b2.move.y + ")" + solution;
                        level--;
                        b2 = statesByLevel[level][b2.parent];
                    }

        //					Debug.Log("Solution " + (nSolutions+1) + ": " + solution);

        //
                    _doneEvent.Set();
                    return;
                }
            }
        }
    }
Example #9
0
    public void Solve(int cenas = 0)
    {
        SolverBoard board = new SolverBoard(matrix);

        statesByLevel = new List<List<BoardState>>();
        statesByLevel.Add(new List<BoardState>());
        statesByLevel.Add(new List<BoardState>());
        nextLevel = 1;
        currentLevel = 0;

        statesByLevel[currentLevel].Add(new BoardState{
            move = new Vector2(0,0),
            board = board,
            parent = -1
        });

        //		List<Thread> pool = new List<Thread>();
        //		for(int i = 0 ; i < 8 ; ++i){
        //			pool.Add(new Thread());
        //		}

        while(!solved){
            for(int b = 0 ; b < statesByLevel[currentLevel].Count ; ++b){
                SolverBoard currentBoard = statesByLevel[currentLevel][b].board;

                SolveCurrentBoard(currentBoard, b);

                if(externalSolved){
                    _doneEvent.Set();
                    return;
                }
            }

            if(!solved){
                AddLevel();
            }
        }

        minMoves = statesByLevel.Count -1;

        int nSolutions = 0;
        for(int i = 0 ; i < statesByLevel[minMoves].Count ; ++i){
            if(statesByLevel[minMoves][i].board.solved){
                nSolutions++;

                BoardState b = statesByLevel[minMoves][i];
                int level = minMoves;
                string solution = "";
                while (b.parent != -1){
                    solution = "(" + b.move.x + "," + b.move.y + ")" + solution;
                    level--;
                    b = statesByLevel[level][b.parent];
                }

                Debug.Log("Solution " + (nSolutions+1) + ": " + solution);
            }
        }

        Debug.Log("Min Moves: " + minMoves) ;
        Debug.Log("NSolutions: " + nSolutions) ;

        //        _min = 0;
        //        _moves = "";
        _doneEvent.Set();
    }
Example #10
0
    public void Solve(int cenas = 0)
    {
        SolverBoard board = new SolverBoard(matrix);

        statesByLevel = new List <List <BoardState> >();
        statesByLevel.Add(new List <BoardState>());
        statesByLevel.Add(new List <BoardState>());
        nextLevel    = 1;
        currentLevel = 0;

        statesByLevel[currentLevel].Add(new BoardState {
            move   = new Vector2(0, 0),
            board  = board,
            parent = -1
        });

        //		List<Thread> pool = new List<Thread>();
        //		for(int i = 0 ; i < 8 ; ++i){
        //			pool.Add(new Thread());
        //		}

        while (!solved)
        {
            for (int b = 0; b < statesByLevel[currentLevel].Count; ++b)
            {
                SolverBoard currentBoard = statesByLevel[currentLevel][b].board;

                SolveCurrentBoard(currentBoard, b);

                if (externalSolved)
                {
                    _doneEvent.Set();
                    return;
                }
            }

            if (!solved)
            {
                AddLevel();
            }
        }

        minMoves = statesByLevel.Count - 1;

        int nSolutions = 0;

        for (int i = 0; i < statesByLevel[minMoves].Count; ++i)
        {
            if (statesByLevel[minMoves][i].board.solved)
            {
                nSolutions++;

                BoardState b        = statesByLevel[minMoves][i];
                int        level    = minMoves;
                string     solution = "";
                while (b.parent != -1)
                {
                    solution = "(" + b.move.x + "," + b.move.y + ")" + solution;
                    level--;
                    b = statesByLevel[level][b.parent];
                }

                Debug.Log("Solution " + (nSolutions + 1) + ": " + solution);
            }
        }

        Debug.Log("Min Moves: " + minMoves);
        Debug.Log("NSolutions: " + nSolutions);

        //        _min = 0;
        //        _moves = "";
        _doneEvent.Set();
    }
Example #11
0
    // Use this for initialization
    void Start()
    {
        //		string m = "1000000011100001100100000000000010100000011000001000010001110010";//8x8
        string m = "001101110010010100101100001000000010";        //6x6
//		string m = "1110000101100100";//4x4
        SolverBoard b = new SolverBoard(m);

        Debug.Log(b.ToString());

        SolverClass solver = new SolverClass(m);
//		List<Thread> threads = new List<Thread>();

        List <SolverClass> solvers = new List <SolverClass>();

        ManualResetEvent[] doneEvents = new ManualResetEvent[m.Length];


        int ac = 0;

        for (int x = 0; x < solver.length; ++x)
        {
            for (int y = 0; y < solver.length; ++y)
            {
                b.ApplyMove(x, y);

                doneEvents[ac] = new ManualResetEvent(false);

                solvers.Add(new SolverClass(b.matrix_str, doneEvents[ac]));

//				threads.Add(new Thread(() => solvers[solvers.Count-1].Solve()));

                ThreadPool.QueueUserWorkItem((object a) => solvers[solvers.Count - 1].Solve(0));

                ac++;
            }
        }

        bool waitALittleMore = false;

        int min = 1000000;

        do
        {
            WaitHandle.WaitAll(doneEvents);

            for (int i = 0; i < solvers.Count; ++i)
            {
                if (solvers[i].solved)
                {
                    if (solvers[i].minMoves < min)
                    {
                        min = solvers[i].minMoves;
//						solvers[i].
                    }
                }
            }

            waitALittleMore = false;

            for (int i = 0; i < solvers.Count && !waitALittleMore; ++i)
            {
                if (solvers[i].statesByLevel.Count - 1 < min)
                {
                    waitALittleMore = true;
                }
            }
        }while(waitALittleMore);

        for (int i = 0; i < solvers.Count; ++i)
        {
            solvers[i].externalSolved = true;
        }

        Debug.Log("Ended");
        Debug.Log("Min = " + min);
    }
Example #12
0
    public void SolveCurrentBoard(SolverBoard currentBoard, int b)
    {
        for (int x = currentBoard.minX; x < currentBoard.maxX; ++x)
        {
            for (int y = currentBoard.minY; y < currentBoard.maxY; ++y)
            {
                SolverBoard aux = new SolverBoard(currentBoard);

                aux.ApplyMove(x, y);

                if (statesByLevel.Count > 2)
                {
                    //int grandFather = statesByLevel[currentLevel][b].parent
                    bool exist = false;
                    for (int i = 0; i < statesByLevel.Count - 1 && !exist; ++i)
                    {
                        for (int j = 0; j < statesByLevel[i].Count && !exist; ++j)
                        {
                            if (SolverBoard.Compare(aux, statesByLevel[i][j].board))
                            {
                                exist = true;
                            }
                        }
                    }

                    if (!exist)
                    {
                        AddBoardToSolve(aux, x, y, b);
                    }
                }
                else
                {
                    AddBoardToSolve(aux, x, y, b);
                }

                //						AddBoardToSolve(aux, x, y, b);

                if (aux.solved)
                {
                    //PUZZLE SOLVED!!!
                    solved = true;

                    minMoves = statesByLevel.Count - 1;


                    BoardState b2    = statesByLevel[nextLevel][statesByLevel[nextLevel].Count - 1];
                    int        level = minMoves;

                    while (b2.parent != -1)
                    {
                        solution = "(" + b2.move.x + "," + b2.move.y + ")" + solution;
                        level--;
                        b2 = statesByLevel[level][b2.parent];
                    }

//					Debug.Log("Solution " + (nSolutions+1) + ": " + solution);

//
                    _doneEvent.Set();
                    return;
                }
            }
        }
    }