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)); }
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; } } }