De presentatie wordt gedownload. Even geduld aub

De presentatie wordt gedownload. Even geduld aub

Vervolg C Hogeschool van Utrecht / Institute for Computer, Communication and Media Technology 1 Onderwerpen voor vandaag Backtracking: –Permutaties –Koninginnen.

Verwante presentaties


Presentatie over: "Vervolg C Hogeschool van Utrecht / Institute for Computer, Communication and Media Technology 1 Onderwerpen voor vandaag Backtracking: –Permutaties –Koninginnen."— Transcript van de presentatie:

1 vervolg C Hogeschool van Utrecht / Institute for Computer, Communication and Media Technology 1 Onderwerpen voor vandaag Backtracking: –Permutaties –Koninginnen Opgave: frankeren

2 vervolg C Hogeschool van Utrecht / Institute for Computer, Communication and Media Technology 2 Backtracking Techniek voor het brute-force zoeken van oplossingen. 1. Begin met een ‘lege’ oplossing 2. Doe een stap, hopelijk in de goede richting 3. Als je een oplossing gevonden hebt: mooi zo 4. Als het duidelijk is dat je fout zit dan doe je de laatste stap weer terug (daar komt de naam backtracking vandaan) 5. Als je niet fout zit en nog niet aan een complete oplossing bent: zie 2.

3 vervolg C Hogeschool van Utrecht / Institute for Computer, Communication and Media Technology 3 Probleem: Genereer alle mogelijke ordeningen (rijtjes) van de cijfers 0..9. Ieder cijfer mag maar 1 keer voorkomen. Oplossing: genereer alle rijtjes van 10 cijfers, maak je geen zorgen over duplicaten. Filter alleen wel de rijtjes eruit die duplicaten bevatten. permutaties

4 vervolg C Hogeschool van Utrecht / Institute for Computer, Communication and Media Technology 4 for( a[0] =0; a[0] <10; a[0]++ ) for( a[1] =0; a[1] <10; a[1]++ )... for( a[9] = 0; a[9] <10; a[9]++ ) if( ! duplicates( a ) ) solution( a ); Permutaties 1

5 vervolg C Hogeschool van Utrecht / Institute for Computer, Communication and Media Technology 5 void permutate( int a[10]; int i ){ if( i == 10 ){ if( ! duplicates( a )) solution( a ) return; } for( j = 0; j < 10; i++ ){ a[ i ] = j; permutate( a, i + 1 ); } Permutaties 2

6 vervolg C Hogeschool van Utrecht / Institute for Computer, Communication and Media Technology 6 void permutate( int a[10]; int i ){ if( duplicates( a )) return; if( i == 10 ){ solution( a ); return; } for( j = 0; j < 10; i++ ){ a[ i ] = j; permutate( a, i + 1 ); a[ i ] = -1; } Permutaties 3

7 vervolg C Hogeschool van Utrecht / Institute for Computer, Communication and Media Technology 7 Het koninginnen probleem Probleem: Plaats 8 koninginnen op een schaakbord, zodanig dat zij elkaar niet kunnen slaan.

8 vervolg C Hogeschool van Utrecht / Institute for Computer, Communication and Media Technology 8 Het koninginnen probleem Oplossing: Gegeven een schaakbord met N (<8) koninginnen die elkaar niet kunnen slaan. Probeer voor ieder vrij veld of daar een koningin geplaatst kan worden zonder dat zij een van de anderen kan slaan. Voor iedere plek waar dat kan heb je een oplossing met N + 1 koninginnen.

9 vervolg C Hogeschool van Utrecht / Institute for Computer, Communication and Media Technology 9 typedef int board[8][8]; void queens( board b, int n ){ int i, j; if( n == 8 ){ print_board( b ); return; } for( i = 0; i < 8; i++ ) for( j = 0; j < 8; j++ ){ if( ! board[ i ][ j ] ){ board[ i ][ j ] = 1; if( valid_board( b, i, j )){ queens( b, n + 1 ); } board[ i ][ j ] = 0; }

10 vervolg C Hogeschool van Utrecht / Institute for Computer, Communication and Media Technology 10 Opdracht ”frankeren” Ik heb postzegels van 44, 72 en 89 cent. Dat waren de standaard tarieven voor Nederland, Europa en Wereldwijd. Helaas zijn de tarieven voor buiten Nederland per 1-1-2008 iets verhoogd. Ik wil frankeren volgens de nieuwe tarieven, maar wel met de postzegels die ik in huis heb, en ik wil natuurlijk zo min mogelijk verspillen. Welke zegels moet ik plakken voor de volgende tarieven? (europa): 0.75, 1.50, 2.25, 3.00, 6.00 (wereld): 0.92, 1.84, 2.76, 5.52, 10.12

11 vervolg C Hogeschool van Utrecht / Institute for Computer, Communication and Media Technology 11 Opdracht ”frankeren” #define N_ZEGELS 3 int zegels[ 3 ] = { 44, 72, 89 };... int main(int argc, char *argv[]){ frankeer( 75 ); frankeer( 150 ); frankeer( 225 ); frankeer( 300 ); frankeer( 600 ); frankeer( 92 ); frankeer( 184 ); frankeer( 276 ); frankeer( 552 ); frankeer( 1012 ); system("PAUSE"); return 0; }

12 vervolg C Hogeschool van Utrecht / Institute for Computer, Communication and Media Technology 12 Opdracht ”frankeren” void frankeer( int porto ){ int i, beste; int lijstje[ N_ZEGELS ]; int beste_lijstje[ N_ZEGELS ]; for( i = 0; i < N_ZEGELS; i++ ){ lijstje[ i ] = 0; } beste = 999999; voeg_toe( porto, 0, -1, lijstje, &beste, beste_lijstje ); printf( "%-4d kost %-4d :", porto, beste ); for( i = 0; i < N_ZEGELS; i++ ){ printf( "%2d keer %2d, ", beste_lijstje[ i ], zegels[ i ] ); } printf( "\n" ); }

13 vervolg C Hogeschool van Utrecht / Institute for Computer, Communication and Media Technology 13 Opdracht ”frankeren” Maak een recursieve functie: void voeg_toe( int porto, int totaal, int zegel, int lijstje[], int *beste, int beste_lijstje[] ); Porto is het bedrag dat geplakt moet worden, totaal het bedrag dat not nu toe geplakt is. Zegel is de index van de zegel die er bij geplakt gaat worden. Lijstje is voor iedere zegel het aantal dat tot nu toe geplakt is. Beste is het totaal bedrag van de tot nu toe beste keuze aan zegels. Beste_lijstje is het lijstje dat hoort bij beste. De functie moet zegel (mits niet -1) toevoegen aan lijstje en totaal. Als het totaal nu gelijk aan of hoger dan porto is dan hebben we een oplossing. Als het totaal ook nog eens kleiner is dan *beste dan hebben we een betere oplossing dan we tot nu toe hadden, en moeten we dus die (*beste en beste_lijstje) oplossing vervangen door de huidige. Als het totaal kleiner is dan porto dan dan roepen we de functie zelf weer aan voor alle mogelijke waarden (indexen) van zegel.

14 vervolg C Hogeschool van Utrecht / Institute for Computer, Communication and Media Technology 14 Opdracht ”frankeren” Let op !! -Waarom is beste een pointer -Waarom zijn porto en totaal geen pointers? -Waarom zijn lijstje en beste_lijstje geen pointers? In de vorige sheet is het eigenlijke backtracken niet vermeld. -In welke twee parameters bouw je de oplossing op? -Wat moet je doen om te ‘backtracken’?


Download ppt "Vervolg C Hogeschool van Utrecht / Institute for Computer, Communication and Media Technology 1 Onderwerpen voor vandaag Backtracking: –Permutaties –Koninginnen."

Verwante presentaties


Ads door Google