Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

ACM ICPC Praktikum Kapitel 8: Backtracking. Übersicht Backtracking Aufzählung aller Teilmengen Aufzählung aller Permutationen n-Königinnen-Problem.

Ähnliche Präsentationen


Präsentation zum Thema: "ACM ICPC Praktikum Kapitel 8: Backtracking. Übersicht Backtracking Aufzählung aller Teilmengen Aufzählung aller Permutationen n-Königinnen-Problem."—  Präsentation transkript:

1 ACM ICPC Praktikum Kapitel 8: Backtracking

2 Übersicht Backtracking Aufzählung aller Teilmengen Aufzählung aller Permutationen n-Königinnen-Problem

3 Backtracking Grundsätzlicher Ansatz: Angenommen, Lösung sei gegeben als Vektor a=(a 1,a 2,…,a n ), a i 2 S i Gegeben Teillösung (a 1,…,a k ), erweitere sie durch weiteres Element. Lösung vollständig: werte sie aus, sonst führe weiteres Backtracking über Elemente a k+1 2 S k+1 durch

4 Backtracking 1.bool finished = FALSE; /* found all solutions yet? */ 2.backtrack(int a[], int k, data input) 3.{ 4. int c[MAXCANDIDATES]; /* candidates for next position */ 5. int ncandidates; /* next position candidate count */ 6. int i; /* counter */ 7. if (is_a_solution(a,k,input)) 8. process_solution(a,k,input); 9. else { 10. k = k+1; 11. construct_candidates(a,k,input,c,&ncandidates); 12. for (i=0; i<ncandidates; i++) { 13. a[k] = c[i]; 14. backtrack(a,k,input); 15.if (finished) return;/* terminate early */ 16. } 17. } 18.}

5 Backtracking Anwendungsspezifische Teile: is_a_solution(a,k,input): testet auf vollständige Lösung process_solution(a,k): wertet Lösung aus construct_candidates(a,k,input,c,ncandidat es): füllt Feld c mit allen möglichen Kandidaten für a k

6 Aufzählung aller Teilmengen S k = {TRUE, FALSE} gibt an, ob a k in der Teilmenge ist. is_a_solution(int a[], int k, int n) { return (k == n); } construct_candidates(int a[], int k, int n, int c[], int *ncandidates) { c[0] = TRUE; c[1] = FALSE; *ncandidates = 2; }

7 Aufzählung aller Teilmengen process_solution(int a[], int k) { gib Permutation aus } generate subsets(int n) { int a[NMAX]; backtrack(a,0,n); }

8 Aufzählung aller Permutationen S k = {1,…,n} process_solution(int a[], int k) { int i;/* counter */ for (i=1; i<=k; i++) printf(" %d",a[i]); printf("\n"); } is_a_solution(int a[], int k, int n) { return (k == n); }

9 Aufzählung aller Permutationen construct_candidates(int a[], int k, int n, int c[], int *ncandidates) { int i;/* counter */ bool in_perm[NMAX];/* what is now in the permutation? */ for (i=1; i<NMAX; i++) in_perm[i] = FALSE; for (i=0; i<k; i++) in_perm[ a[i] ] = TRUE; *ncandidates = 0; for (i=1; i<=n; i++) if (in_perm[i] == FALSE) { c[ *ncandidates] = i; *ncandidates = *ncandidates + 1; } Aufruf: backtrack(a,0,3);

10 n-Königinnen-Problem Problem: platziere n Königinnen auf n £ n Schachfeld so, dass sie sich nicht schlagen können. Test aller möglichen Platzierungen: (n 2 )!/(n 2 -n)! n!), was schnell zur gigantischen Zahl wird

11 n-Königinnen-Problem Beschränkungen des Suchraums: Jede Zeile muss genau eine Königin enthalten Jede Spalte muss genau eine Königin enthalten Reihenfolge der Königinnen spielt keine Rolle (zählt als eine Möglichkeit) Also kann jede legale Positionierung der Königinnen als Permutation angesehen werden. Ist Permutation legal, dann auch jeder Shift und die inverse Permutation

12 n-Königinnen-Problem int solution_count; /* how many solutions are there? */ process_solution(int a[], int k) { int i;/* counter */ solution_count ++; } is_a_solution(int a[], int k, int n) { return (k == n); }

13 n-Königinnen-Problem construct_candidates(int a[], int k, int n, int c[], int *ncandidates) { int i,j;/* counters */ bool legal_move;/* might the move be legal? */ *ncandidates = 0; for (i=1; i<=n; i++) { legal_move = TRUE; for (j=1; j<k; j++) { if (abs((k)-j) == abs(i-a[j])) /* diagonal threat */ legal_move = FALSE; if (i == a[j]) /* column threat */ legal_move = FALSE; } if (legal_move == TRUE) { c[*ncandidates] = i; *ncandidates = *ncandidates + 1; }

14 n-Königinnen-Problem main() { int a[NMAX];/* solution vector */ int i;/* counter */ for (i=1; i<=10; i++) { solution_count = 0; backtrack(a,0,i); printf("n=%d solution_count=%d\n",i,solution_count); }


Herunterladen ppt "ACM ICPC Praktikum Kapitel 8: Backtracking. Übersicht Backtracking Aufzählung aller Teilmengen Aufzählung aller Permutationen n-Königinnen-Problem."

Ähnliche Präsentationen


Google-Anzeigen