-
Notifications
You must be signed in to change notification settings - Fork 1
/
ParseurH.java
144 lines (124 loc) · 4.78 KB
/
ParseurH.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Map;
import java.util.TreeMap;
import java.util.Vector;
public class ParseurH {
protected Urgence urgence;
protected Etat etatInitial;
protected But but;
/*******************************************************
* Cette fonction parse le fichier de map determinant - la position initiale de
* l'ambulance (A) - la position de l'hopital (H) - la position des
* individus-patients (I)
*******************************************************/
public void parse(String nomFichier) throws IOException {
// Ouverture du fichier
FileInputStream in = null;
try {
File inputFile = new File(nomFichier);
in = new FileInputStream(inputFile);
} catch (Exception e) {
return;
}
BufferedReader bin = new BufferedReader(new InputStreamReader(in));
/* Lecture du fichier */
// recupération des deux premieres lignes contenant
// 1) le nombre de lignes de la map
// 2) le nombre de colonnes de la map
String input;
input = bin.readLine();
int nbLignes = Integer.parseInt(input);
input = bin.readLine();
int nbColonnes = Integer.parseInt(input);
// initialisation des variables
String nomCol = "";
urgence = new Urgence();
etatInitial = new Etat(urgence);
Vector<String> positionsPatients = new Vector<>();
Map<String, Emplacement> destinations = new TreeMap<>();
// création des emplacements
for (int i = 0; i < nbLignes; i++) {
input = bin.readLine();
for (int j = 0; j < nbColonnes; j++) {
/*
* input.charAt(j) est le caractere lu si ' ' ne rien faire (ca sera une route
* bloquée) si 'A' c'est la position initiale de l'ambulance si 'H' c'est la
* osition de l'hopital si 'I' c'est la position d'un patient si '#' c'est une
* zone à traffic normal si '-' c'est une zone d'embouteillage aucun autre
* aractere n'est accepté
*/
if (input.charAt(j) != ' ' && input.charAt(j) != 'A' && input.charAt(j) != 'H' && input.charAt(j) != 'I'
&& input.charAt(j) != '#' && input.charAt(j) != '-') {
System.err.println("FICHIER MAL FORMÉ");
System.exit(-1);
}
if (input.charAt(j) != ' ') {
// emplacement créé
String name = i + "-" + j;
Emplacement location = new Emplacement(name, i, j, "" + input.charAt(j));
urgence.emplacements.put(name, location);
// les cas particuliers
if (input.charAt(j) == 'A')
etatInitial.emplacementAmbulance = urgence.emplacements.get(name);
if (input.charAt(j) == 'I') {
positionsPatients.add(name);
}
if (input.charAt(j) == 'H') {
Emplacement e = urgence.emplacements.get(name);
destinations.put(name, e);
nomCol = name;
}
}
}
}
// Pour chaque emplacement on teste l'existence d'emplacements adjacents
// si un adjacent existe, on rajoute une route qui va de l'emplacement
// vers l'adjacent.
for (int i = 0; i < nbLignes; i++) {
for (int j = 0; j < nbColonnes; j++) {
// On teste l'existence de l'emplacement position "i-j"
if (urgence.emplacements.get(i + "-" + j) != null) {
Emplacement l1 = urgence.emplacements.get(i + "-" + j);
// on crée les routes existantes (4 directions a tester)
if (urgence.emplacements.get(i + "-" + (j - 1)) != null) {
Emplacement l2 = urgence.emplacements.get(i + "-" + (j - 1));
l1.routes.add(new Route(l1, l2));
}
if (urgence.emplacements.get((i - 1) + "-" + j) != null) {
Emplacement l2 = urgence.emplacements.get((i - 1) + "-" + j);
l1.routes.add(new Route(l1, l2));
}
if (urgence.emplacements.get(i + "-" + (j + 1)) != null) {
Emplacement l2 = urgence.emplacements.get(i + "-" + (j + 1));
l1.routes.add(new Route(l1, l2));
}
if (urgence.emplacements.get((i + 1) + "-" + j) != null) {
Emplacement l2 = urgence.emplacements.get((i + 1) + "-" + j);
l1.routes.add(new Route(l1, l2));
}
}
}
}
int nbPatients = positionsPatients.size();
// creation d'un masque qui indique si les patients ont été récupérés
// et on transfert les emplacements des patients à l'etat initial
etatInitial.patientsRecuperes = new boolean[nbPatients];
etatInitial.emplacementsPatients = new Emplacement[nbPatients];
for (int i = 0; i < nbPatients; i++)
etatInitial.emplacementsPatients[i] = urgence.emplacements.get(positionsPatients.get(i));
// generation des buts, but identiques tous egaux a l'hopital... super
// interessant
but = new But();
but.destinationsPatients = new Emplacement[nbPatients];
for (int i = 0; i < nbPatients; i++)
but.destinationsPatients[i] = destinations.get(nomCol);
}
}