Esempio n. 1
0
        private void create_road()
        {
            Cell_Dijkstra temp = null;

            for (int i = 0; i < cont_noduri; i++)
            {
                if (cell_dijk[i].x == rows - 1 && cell_dijk[i].y == cols - 1)
                {
                    temp = cell_dijk[i];
                    break;
                }
            }

            int cont = 0;

            //while didn't reach the start
            while (temp.get_cur_dist() != 0)
            {
                road.Push(new KeyValuePair <int, int>(temp.x, temp.y));

                Boolean ok = new Boolean();
                ok = true;

                int i;
                for (i = 0; i < cont_noduri && ok; i++)
                {
                    if (cell_dijk[i].x == temp.cost_from.Key && cell_dijk[i].y == temp.cost_from.Value)
                    {
                        ok = false;
                    }
                }

                temp = cell_dijk[i - 1];

                cont++;
            }

            road.Push(new KeyValuePair <int, int>(0, start_col));
        }
Esempio n. 2
0
        public void fill_cell_dijkstra()
        {
            Queue <Cell> que = new Queue <Cell>();

            que.Enqueue(grid[0][start_col]);

            int [] wall = new int[4];

            while (que.Count > 0)
            {
                Cell temp = que.Dequeue();

                KeyValuePair <int, int> vecin_sus = new KeyValuePair <int, int>(-1, -1);
                KeyValuePair <int, int> vecin_jos = new KeyValuePair <int, int>(-1, -1);
                KeyValuePair <int, int> vecin_st  = new KeyValuePair <int, int>(-1, -1);
                KeyValuePair <int, int> vecin_dr  = new KeyValuePair <int, int>(-1, -1);

                int dist_sus = -1;
                int dist_jos = -1;
                int dist_st  = -1;
                int dist_dr  = -1;


                for (int i = 0; i < 4; i++)
                {
                    wall[i] = temp.get_wall(i);
                }

                for (int i = 0; i < 4; i++)
                {
                    if (wall[i] != -1)
                    {
                        int dist = 0;

                        Cell aux_cell;

                        switch (i)
                        {
                        case 0:
                        {
                            aux_cell = grid[temp.x - 1][temp.y];
                            dist++;

                            Boolean ok = new Boolean();
                            ok = true;

                            while (ok)
                            {
                                //caz blocat in directia de mers
                                if (aux_cell.get_wall(0) == -1)
                                {
                                    ok = false;
                                }
                                //caz deschis in stanga
                                if (aux_cell.get_wall(2) != -1)
                                {
                                    ok = false;
                                }
                                //caz deschis in dreapta
                                if (aux_cell.get_wall(3) != -1)
                                {
                                    ok = false;
                                }

                                if (ok == true)
                                {
                                    aux_cell = grid[aux_cell.x - 1][aux_cell.y];
                                    dist++;
                                }
                            }

                            if (aux_cell.visited != 1)
                            {
                                que.Enqueue(aux_cell);
                            }

                            dist_sus  = dist;
                            vecin_sus = new KeyValuePair <int, int>(aux_cell.x, aux_cell.y);

                            break;
                        }

                        case 1:
                        {
                            aux_cell = grid[temp.x + 1][temp.y];
                            dist++;

                            Boolean ok = new Boolean();
                            ok = true;

                            while (ok)
                            {
                                //caz blocat in directia de mers
                                if (aux_cell.get_wall(1) == -1)
                                {
                                    ok = false;
                                }
                                //caz deschis in stanga
                                if (aux_cell.get_wall(2) != -1)
                                {
                                    ok = false;
                                }
                                //caz deschis in dreapta
                                if (aux_cell.get_wall(3) != -1)
                                {
                                    ok = false;
                                }

                                if (ok == true)
                                {
                                    aux_cell = grid[aux_cell.x + 1][aux_cell.y];
                                    dist++;
                                }
                            }

                            if (aux_cell.visited != 1)
                            {
                                que.Enqueue(aux_cell);
                            }

                            dist_jos  = dist;
                            vecin_jos = new KeyValuePair <int, int>(aux_cell.x, aux_cell.y);

                            break;
                        }

                        case 2:
                        {
                            aux_cell = grid[temp.x][temp.y - 1];
                            dist++;

                            Boolean ok = new Boolean();
                            ok = true;

                            while (ok)
                            {
                                //caz blocat in directia de mers
                                if (aux_cell.get_wall(2) == -1)
                                {
                                    ok = false;
                                }
                                //caz deschis in sus
                                if (aux_cell.get_wall(0) != -1)
                                {
                                    ok = false;
                                }
                                //caz deschis in jos
                                if (aux_cell.get_wall(1) != -1)
                                {
                                    ok = false;
                                }

                                if (ok == true)
                                {
                                    aux_cell = grid[aux_cell.x][aux_cell.y - 1];
                                    dist++;
                                }
                            }

                            if (aux_cell.visited != 1)
                            {
                                que.Enqueue(aux_cell);
                            }

                            dist_st  = dist;
                            vecin_st = new KeyValuePair <int, int>(aux_cell.x, aux_cell.y);

                            break;
                        }

                        case 3:
                        {
                            aux_cell = grid[temp.x][temp.y + 1];
                            dist++;

                            Boolean ok = new Boolean();
                            ok = true;

                            while (ok)
                            {
                                //caz blocat in directia de mers
                                if (aux_cell.get_wall(3) == -1)
                                {
                                    ok = false;
                                }
                                //caz deschis in sus
                                if (aux_cell.get_wall(0) != -1)
                                {
                                    ok = false;
                                }
                                //caz deschis in jos
                                if (aux_cell.get_wall(1) != -1)
                                {
                                    ok = false;
                                }

                                if (ok == true)
                                {
                                    aux_cell = grid[aux_cell.x][aux_cell.y + 1];
                                    dist++;
                                }
                            }

                            if (aux_cell.visited != 1)
                            {
                                que.Enqueue(aux_cell);
                            }

                            dist_dr  = dist;
                            vecin_dr = new KeyValuePair <int, int>(aux_cell.x, aux_cell.y);

                            break;
                        }
                        }
                    }
                }

                //mark cell as visite
                temp.visited = 1;
                //Console.Write(temp.x + " " + temp.y + "\n");
                //create it as disj cell
                cell_dijk[cont_noduri] = new Cell_Dijkstra(temp.x, temp.y);
                //set neighbours
                cell_dijk[cont_noduri].set_cell_neighbour(vecin_sus, 0);
                cell_dijk[cont_noduri].set_cell_neighbour(vecin_jos, 1);
                cell_dijk[cont_noduri].set_cell_neighbour(vecin_st, 2);
                cell_dijk[cont_noduri].set_cell_neighbour(vecin_dr, 3);
                //set distance to neighbours
                cell_dijk[cont_noduri].set_dist_to_neighbour(dist_sus, 0);
                cell_dijk[cont_noduri].set_dist_to_neighbour(dist_jos, 1);
                cell_dijk[cont_noduri].set_dist_to_neighbour(dist_st, 2);
                cell_dijk[cont_noduri].set_dist_to_neighbour(dist_dr, 3);

                cont_noduri++;

                if (temp.x == rows - 1 && temp.y == cols - 1)
                {
                    break;
                }
            }
        }
Esempio n. 3
0
        private void create_cost()
        {
            for (int i = 0; i < cont_noduri; i++)
            {
                cell_dijk[i].visit     = 0;
                cell_dijk[i].cost_from = new KeyValuePair <int, int>(-1, -1);
            }

            //setez costul start 0
            cell_dijk[0].set_cur_dist(0);

            Queue <Cell_Dijkstra> que = new Queue <Cell_Dijkstra>();

            que.Enqueue(cell_dijk[0]);

            while (que.Count > 0)
            {
                Cell_Dijkstra temp = que.Dequeue();

                Cell_Dijkstra vecin_sus = null;
                Cell_Dijkstra vecin_jos = null;
                Cell_Dijkstra vecin_st  = null;
                Cell_Dijkstra vecin_dr  = null;

                for (int i = 0; i < 4; i++)
                {
                    if (temp.get_dist_to_neighbour(i) != -1)
                    {
                        switch (i)
                        {
                        case 0:
                        {
                            Boolean ok = new Boolean();
                            ok = true;

                            for (int j = 0; j < cont_noduri && ok; j++)
                            {
                                if (cell_dijk[j].x == temp.get_cell_neighbour(0).Key&& cell_dijk[j].y == temp.get_cell_neighbour(0).Value)
                                {
                                    if (cell_dijk[j].get_cur_dist() > temp.get_cur_dist() + temp.get_dist_to_neighbour(0))
                                    {
                                        cell_dijk[j].set_cur_dist(temp.get_cur_dist() + temp.get_dist_to_neighbour(0));
                                        cell_dijk[j].cost_from = new KeyValuePair <int, int>(temp.x, temp.y);
                                    }
                                    ok = false;

                                    vecin_sus = cell_dijk[j];
                                }
                            }
                            break;
                        }

                        case 1:
                        {
                            Boolean ok = new Boolean();
                            ok = true;

                            for (int j = 0; j < cont_noduri && ok; j++)
                            {
                                if (cell_dijk[j].x == temp.get_cell_neighbour(1).Key&& cell_dijk[j].y == temp.get_cell_neighbour(1).Value)
                                {
                                    if (cell_dijk[j].get_cur_dist() > temp.get_cur_dist() + temp.get_dist_to_neighbour(1))
                                    {
                                        cell_dijk[j].set_cur_dist(temp.get_cur_dist() + temp.get_dist_to_neighbour(1));
                                        cell_dijk[j].cost_from = new KeyValuePair <int, int>(temp.x, temp.y);
                                    }
                                    ok = false;

                                    vecin_jos = cell_dijk[j];
                                }
                            }
                            break;
                        }

                        case 2:
                        {
                            Boolean ok = new Boolean();
                            ok = true;

                            for (int j = 0; j < cont_noduri && ok; j++)
                            {
                                if (cell_dijk[j].x == temp.get_cell_neighbour(2).Key&& cell_dijk[j].y == temp.get_cell_neighbour(2).Value)
                                {
                                    if (cell_dijk[j].get_cur_dist() > temp.get_cur_dist() + temp.get_dist_to_neighbour(2))
                                    {
                                        cell_dijk[j].set_cur_dist(temp.get_cur_dist() + temp.get_dist_to_neighbour(2));
                                        cell_dijk[j].cost_from = new KeyValuePair <int, int>(temp.x, temp.y);
                                    }
                                    ok = false;

                                    vecin_st = cell_dijk[j];
                                }
                            }
                            break;
                        }

                        case 3:
                        {
                            Boolean ok = new Boolean();
                            ok = true;

                            for (int j = 0; j < cont_noduri && ok; j++)
                            {
                                if (cell_dijk[j].x == temp.get_cell_neighbour(3).Key&& cell_dijk[j].y == temp.get_cell_neighbour(3).Value)
                                {
                                    if (cell_dijk[j].get_cur_dist() > temp.get_cur_dist() + temp.get_dist_to_neighbour(3))
                                    {
                                        cell_dijk[j].set_cur_dist(temp.get_cur_dist() + temp.get_dist_to_neighbour(3));
                                        cell_dijk[j].cost_from = new KeyValuePair <int, int>(temp.x, temp.y);
                                    }

                                    ok = false;

                                    vecin_dr = cell_dijk[j];
                                }
                            }
                            break;
                        }
                        }
                    }
                }

                temp.visit = 1;

                if (vecin_sus != null && vecin_sus.visit != 1)
                {
                    que.Enqueue(vecin_sus);
                }
                if (vecin_jos != null && vecin_jos.visit != 1)
                {
                    que.Enqueue(vecin_jos);
                }
                if (vecin_st != null && vecin_st.visit != 1)
                {
                    que.Enqueue(vecin_st);
                }
                if (vecin_dr != null && vecin_dr.visit != 1)
                {
                    que.Enqueue(vecin_dr);
                }

                if (temp.x == rows - 1 && temp.y == cols - 1)
                {
                    break;
                }
            }
        }