2021-03-22
slides.com/jod/pt_13b
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
Bouw een kandidaat stap per stap
Programmeertechnieken [B-KUL-YI0855]
De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021
1 | |
1 | 0 |
1 | 0 |
0 |
1 | 0 |
1 |
1 | 0 |
0 | 1 |
1 | 1 |
Programmeertechnieken [B-KUL-YI0855]
De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021
Schrijf procedures om
int aantalUitbreidingen(<partiële kandidaat> k);
void maakVolgendeUitbreiding(<partiële kandidaat> k, int i);
int test(<partiële kandidaat> k);
int isCompleet(<partiële kandidaat> k);
void backtrack(<partiële kandidaat> k, int i);
Programmeertechnieken [B-KUL-YI0855]
De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021
void zoek(<partiële kandidaat> k) {
if (!test(k)) {
return; // geen uitbreiding tot oplossing
}
if (isCompleet(k)) {
printOplossing(k);
return;
}
int m = aantalUitbreidingen(k);
for (int i = 0; i < m; ++i) {
maakVolgendeUitbreiding(k,i);
zoek(k);
backtrack(k,i);
}
}
Voeg alles samen tot een recursieve zoekmethode
Programmeertechnieken [B-KUL-YI0855]
De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021
1 | |
1 | 0 |
1 | 0 |
0 |
1 | 0 |
1 |
1 | 0 |
0 | 1 |
1 | 1 |
Programmeertechnieken [B-KUL-YI0855]
De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021
typedef struct {
int rooster[2][2];
int ingevuld;
} Kandidaat;
int aantalUitbreidingen(Kandidaat* k){
return 2;
}
void maakVolgendeUitbreiding(Kandidaat* k, int i){
k->rooster[k->ingevuld/2][k->ingevuld%2] = i;
k->ingevuld += 1;
}
void backtrack(Kandidaat* k, int i){
k->ingevuld -= 1;
}
int isCompleet(Kandidaat* k){
return k->ingevuld==4;
}
Programmeertechnieken [B-KUL-YI0855]
De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021
int test(Kandidaat* k){
if(k->ingevuld>1 &&
k->rooster[0][0]==k->rooster[0][1]){
return 0;
} else if(k->ingevuld>2 &&
k->rooster[0][0]==k->rooster[1][0]){
return 0;
} else if(k->ingevuld>3){
if(k->rooster[0][1]==k->rooster[1][1] ||
k->rooster[1][0]==k->rooster[1][1]){
return 0;
}
}
return 1;
}
Programmeertechnieken [B-KUL-YI0855]
De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021
void zoek(<partiële kandidaat> k) {
if (!test(k)) {
return; // geen uitbreiding tot oplossing
}
if (isCompleet(k)) {
printOplossing(k);
return;
}
int m = aantalUitbreidingen(k);
for (int i = 0; i < m; ++i) {
maakVolgendeUitbreiding(k,i);
zoek(k);
backtrack(k,i);
}
}
Programmeertechnieken [B-KUL-YI0855]
De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021
int zoek(<partiële kandidaat> k) {
if (!test(k)) {
return 0; // geen uitbreiding tot oplossing
}
if (isCompleet(k)) {
printOplossing(k);
return 1;
}
int m = aantalUitbreidingen(k);
for (int i = 0; i < m; ++i) {
maakVolgendeUitbreiding(k,i);
if(zoek(k)) {
return 1;
}
backtrack(k,i);
}
return 0;
}
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