-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.cpp
149 lines (136 loc) · 4.93 KB
/
main.cpp
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
145
146
147
148
149
/*
L'input est séparé en 2 parties par une ligne vide.
La première partie de l'input représente l'état d'une liste de piles.
La 2ème partie de l'input représente les mouvements à faire entre ces piles.
Pour les 2 parties de l'exercice, le programme doit retourner la concaténation de tous les éléments se trouvant en haut des piles.
Pour la partie 1, si je dois déplacer 3 éléments de la pile 1 à la pile 2, pour chaque élément, je déplace le premier (l'ordre final sur la pile 2 change).
Pour la partie 2, si je dois déplacer 3 éléments de la pile 1 à la pile 2, je dois déplacer les 3 premiers éléments en conservant leur ordre.
*/
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <sstream>
using namespace std;
vector<string> split(string s, char delim)
{
vector<string> result;
string element;
istringstream tokenStream(s);
while (getline(tokenStream, element, delim))
{
result.push_back(element);
}
return result;
}
// Peut-être faut-il modifier les constantes selon l'input, car dans l'énoncé il n'y a pas de contraintes. J'ai mis ce qui correspondait à mon input
const int NB_LINE_INPUT = 9;
const int NB_PILES = 10;
const int MAX_ELEMENT = 56;
string inputPiles[NB_LINE_INPUT]; // Stockez les inputs qui forment la pile initiale pour les traiter plus tard
int actualIndexInputPile = 0; // L'index actuel pour ajouter les inputs à l'array inputPiles
char pilesPart1[NB_PILES][MAX_ELEMENT]; // Le tableau de pile qui sera utilisé pour la partie 1 de l'exercice
int indexPilesPart1[NB_PILES] = {0}; // L'indice en haut de chaque pile dans le tableau pour la partie 1
char pilesPart2[NB_PILES][MAX_ELEMENT]; // L'équivalent pour la partie 2
int indexPilesPart2[NB_PILES] = {0};
int state = 0; // 0: initialisation | 1: traitement
void parseInputPiles() // Fonction qui crée des piles en fonction des entrées
{
for (int i = actualIndexInputPile - 1; i > -1; i--) // Parcourt les inputs dans l'ordre inverse dans lequel ils ont été fournis
{
string input = inputPiles[i];
int inputLength = input.length();
for (int j = 0; j < inputLength; j += 4) // Séparez la chaîne en groupes de 4 caractères (un élément de la pile est représenté par [X] en comptant l'espace, ce qui donne un groupe de 4)
{
char c = input[j + 1];
// J'ai ajouté cette condition car à la fin de la liste des piles, il y a une ligne qui représente les index de la pile que je ne veux pas utiliser
// Cette condition permet également d'éviter d'ajouter des espaces lorsque cette partie de la pile est vide
if (isalpha(c))
{
int idPile = (j / 4) + 1;
int index = indexPilesPart1[idPile];
pilesPart1[idPile][index] = c;
pilesPart2[idPile][index] = c;
indexPilesPart1[idPile]++;
indexPilesPart2[idPile]++;
}
}
}
}
// Fonction permettant de déplacer le premier élément d'une pile vers le haut d'une autre pile. Cette opération est répétée n fois
void moveElementPilePart1(int idPileFrom, int idPileTo, int n)
{
int indexPileFrom = indexPilesPart1[idPileFrom];
int indexPileTo = indexPilesPart1[idPileTo];
for (int i = 0; i < n; i++)
{
pilesPart1[idPileTo][indexPileTo] = pilesPart1[idPileFrom][indexPileFrom - 1];
indexPileFrom--;
indexPileTo++;
}
indexPilesPart1[idPileFrom] = indexPileFrom;
indexPilesPart1[idPileTo] = indexPileTo;
}
// Fonction permettant de déplacer les n premiers éléments d'une pile vers le haut d'une autre pile tout en conservant l'ordre original des éléments.
void moveElementPilePart2(int idPileFrom, int idPileTo, int n)
{
int indexPileFrom = indexPilesPart2[idPileFrom];
int indexPileTo = indexPilesPart2[idPileTo];
for (int i = n; i != 0; i--)
{
pilesPart2[idPileTo][indexPileTo] = pilesPart2[idPileFrom][indexPileFrom - i];
indexPileTo++;
}
indexPilesPart2[idPileFrom] -= n;
indexPilesPart2[idPileTo] += n;
}
int main()
{
string filename = "input.txt";
ifstream file(filename);
if (!file.is_open())
{
cerr << "Erreur : impossible d'ouvrir le fichier " << filename;
return 1;
}
string line;
while (getline(file, line))
{
if (state == 0)
{
if (!line.empty())
{
inputPiles[actualIndexInputPile] = line;
actualIndexInputPile++;
}
else
{
parseInputPiles();
state = 1;
}
}
else
{
vector<string> operation = split(line, ' ');
int idFrom = stoi(operation[3]);
int idTo = stoi(operation[5]);
int n = stoi(operation[1]);
moveElementPilePart1(idFrom, idTo, n);
moveElementPilePart2(idFrom, idTo, n);
}
}
file.close();
cout << "Part1: ";
for (int i = 1; i < NB_PILES; i++)
{
int index = indexPilesPart1[i];
cout << pilesPart1[i][index - 1];
}
cout << "\nPart2: ";
for (int i = 1; i < NB_PILES; i++)
{
int index = indexPilesPart2[i];
cout << pilesPart2[i][index - 1];
}
return 0;
}