2021-03-22
slides.com/jod/pt_13c
Docent: Jo Devriendt
Assistent: Ann Philips
Coördinator: Joost Vennekens
voornaam.achternaam@kuleuven.be
Programmeertechnieken [B-KUL-YI0855]
De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021
Programmeertechnieken [B-KUL-YI0855]
De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021
Gegeven een N x N rooster, bereken een pad voor een robot van het vakje linksboven naar rechtsonder dat niet door muurtjes # gaat, en dat een minimale afstand heeft (gedefinieerd als de som van de getallen op de vakjes op het pad) ten opzichte van alle andere paden
1 | 1 | 1 | 1 | 1 |
5 | # | # | # | 1 |
1 | 2 | 1 | 1 | 1 |
1 | 3 | 10 | # | # |
1 | 15 | 1 | 1 | 1 |
Programmeertechnieken [B-KUL-YI0855]
De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021
typedef struct {
int x;
int y;
int waarde;
} Vakje;
int main() {
int a[N][N] = {
{1, 1, 1, 1, 1},
{5, MUUR, MUUR, MUUR, 1},
{1, 2, 1, 1, 1},
{1, 3, 10, MUUR, MUUR},
{1, 15, 1, 1, 1},
};
int lengte = 1;
Vakje pad[N*N];
pad[0].x = 0;
pad[0].y = 0;
pad[0].waarde = a[0][0];
zoek(a, pad, lengte);
printPad(bestePad, besteLengte);
}
Vormen samen de kandidaat
Initialisatie met beginvakje
Programmeertechnieken [B-KUL-YI0855]
De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021
void zoek(int a[N][N], Vakje pad[MAX], int lengte) {
if (!test(a, pad, lengte)) {
return;
}
if (isCompleet(pad, lengte)) {
printPad(pad, lengte);
registreer(pad, lengte);
return;
}
for(int i=0; i<aantalUitbreidingen(pad, &lengte); ++i){
maakVolgendeUitbreiding(a, pad, &lengte, i);
zoek(a, pad, lengte);
backtrack(pad, &lengte);
}
}
Programmeertechnieken [B-KUL-YI0855]
De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021
int isCompleet(Vakje pad[MAX], int lengte) {
return pad[lengte - 1].x == N - 1 &&
pad[lengte - 1].y == N - 1;
}
int aantalUitbreidingen(Vakje pad[MAX], int* lengte){
return 4;
}
void backtrack(Vakje pad[MAX], int* lengte) {
*lengte = *lengte - 1;
}
Programmeertechnieken [B-KUL-YI0855]
De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021
void maakVolgendeUitbreiding(int a[N][N],
Vakje pad[MAX], int* lengte, int buur) {
int n = *lengte;
*lengte = n + 1;
pad[n] = pad[n - 1];
if (buur == 0) {
pad[n].x -= 1; // links
} else if (buur == 1) {
pad[n].y -= 1; // boven
} else if (buur == 2) {
pad[n].x += 1; // rechts
} else if (buur == 3) {
pad[n].y += 1; // onder
}
if(pad[n].x>=0 && pad[n].x<N &&
pad[n].y>=0 && pad[n].y<N){
pad[n].waarde = a[pad[n].x][pad[n].y];
}
}
Programmeertechnieken [B-KUL-YI0855]
De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021
// globale variabelen die beste oplossing bijhouden
int besteAfstand = MAXAFSTAND;
int besteLengte = 0;
Vakje bestePad[N*N];
void registreer(Vakje pad[MAX], int lengte) {
besteAfstand = totaleAfstand(pad, lengte);
besteLengte = lengte;
for (int i = 0; i < lengte; ++i) {
bestePad[i] = pad[i];
}
}
Programmeertechnieken [B-KUL-YI0855]
De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021
int test(int a[N][N], Vakje pad[MAX], int lengte) {
if (lengte >= N*N) {
return 0;
}
for (int i = 0; i < lengte; ++i) {
Vakje p = pad[i];
if (p.x < 0 || p.x >= N || p.y < 0 || p.y >= N ||
a[p.x][p.y] == MUUR) {
return 0;
}
}
if (totaleAfstand(pad, lengte) >= besteAfstand) {
return 0;
}
return 1;
}
Programmeertechnieken [B-KUL-YI0855]
De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021
Volledige code op pastebin.com/bh5HWEGj
1 1 1 1 1
5 # # # 1
1 2 1 1 1
1 3 10 # #
1 15 1 1 1
lengte: 23
afstand: 69
+
+
+
+
+ + + + +
...
...
lengte: 9
afstand: 23
+
+
+ + +
+
+ + +
lengte: 13
afstand: 22
+ + + + +
+
+ + +
+
+ + +
Output:
Programmeertechnieken [B-KUL-YI0855]
De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021
Programmeertechnieken [B-KUL-YI0855]
De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021