szachownica
Backtracking zaj ˛ecia 4.
Rekurencja Liczby Fibonacciego NWD Wie˙ze Hanoi szachownica Backtracking Algorytm rekurencyjny:
rozwi ˛azuje problem przez rozwi ˛azanie pewnej liczby prostszych przypadków tego samego problemu
zapisujemy za pomoc ˛a funkcji rekurencyjnej, czyli
wywołuj ˛acej sam ˛a siebie
przykładem mo˙ze by´c omówione wcze´sniej sortowanie przez scalanie
Rekurencja Liczby Fibonacciego NWD Wie˙ze Hanoi szachownica Backtracking Algorytm rekurencyjny:
rozwi ˛azuje problem przez rozwi ˛azanie pewnej liczby prostszych przypadków tego samego problemu zapisujemy za pomoc ˛a funkcji rekurencyjnej, czyli wywołuj ˛acej sam ˛a siebie
przykładem mo˙ze by´c omówione wcze´sniej sortowanie przez scalanie
Rekurencja Liczby Fibonacciego NWD Wie˙ze Hanoi szachownica Backtracking Algorytm rekurencyjny:
rozwi ˛azuje problem przez rozwi ˛azanie pewnej liczby prostszych przypadków tego samego problemu zapisujemy za pomoc ˛a funkcji rekurencyjnej, czyli wywołuj ˛acej sam ˛a siebie
przykładem mo˙ze by´c omówione wcze´sniej sortowanie przez scalanie
Rekurencja Liczby Fibonacciego NWD Wie˙ze Hanoi szachownica Backtracking
Fn— n-ta liczba Fibonacciego
F0=F1=1
Fn=Fn−1+Fn−2dla n > 1
n 0 1 2 3 4 5 6 7
Fn 1 1 2 3 5 8 13 21
zwi ˛azek z królikami
Obliczanie Fn— 1. podej´scie int fib(int n){
if(n <= 1) return 1; return fib(n-1)+fib(n-2); }
Rekurencja Liczby Fibonacciego NWD Wie˙ze Hanoi szachownica Backtracking
Fn— n-ta liczba Fibonacciego
F0=F1=1
Fn=Fn−1+Fn−2dla n > 1
n 0 1 2 3 4 5 6 7
Fn 1 1 2 3 5 8 13 21
zwi ˛azek z królikami
Obliczanie Fn— 1. podej´scie int fib(int n){
if(n <= 1) return 1; return fib(n-1)+fib(n-2); }
Rekurencja Liczby Fibonacciego NWD Wie˙ze Hanoi szachownica Backtracking
Fn— n-ta liczba Fibonacciego
F0=F1=1
Fn=Fn−1+Fn−2dla n > 1
n 0 1 2 3 4 5 6 7 Fn 1 1 2 3 5 8 13 21
zwi ˛azek z królikami
Obliczanie Fn— 1. podej´scie int fib(int n){
if(n <= 1) return 1; return fib(n-1)+fib(n-2); }
Rekurencja Liczby Fibonacciego NWD Wie˙ze Hanoi szachownica Backtracking
Fn— n-ta liczba Fibonacciego
F0=F1=1
Fn=Fn−1+Fn−2dla n > 1
n 0 1 2 3 4 5 6 7 Fn 1 1 2 3 5 8 13 21
zwi ˛azek z królikami
Obliczanie Fn— 1. podej´scie int fib(int n){
if(n <= 1) return 1; return fib(n-1)+fib(n-2); }
Rekurencja Liczby Fibonacciego NWD Wie˙ze Hanoi szachownica Backtracking
Fn— n-ta liczba Fibonacciego
F0=F1=1
Fn=Fn−1+Fn−2dla n > 1
n 0 1 2 3 4 5 6 7 Fn 1 1 2 3 5 8 13 21
zwi ˛azek z królikami
Obliczanie Fn— 1. podej´scie int fib(int n){
if(n <= 1) return 1; return fib(n-1)+fib(n-2); }
Rekurencja Liczby Fibonacciego NWD Wie˙ze Hanoi szachownica Backtracking
Fn— n-ta liczba Fibonacciego
F0=F1=1
Fn=Fn−1+Fn−2dla n > 1
n 0 1 2 3 4 5 6 7 Fn 1 1 2 3 5 8 13 21
zwi ˛azek z królikami
Obliczanie Fn— 1. podej´scie
int fib(int n){
if(n <= 1) return 1; return fib(n-1)+fib(n-2); }
Rekurencja Liczby Fibonacciego NWD Wie˙ze Hanoi szachownica Backtracking Analiza zło˙zono´sci
policzmy ile razy wywołamy fib(0) lub fib(1) licz ˛ac fib(n)
licz ˛ac fib(0) lub fib(1) zrobimy jedno wywołanie
licz ˛ac fib(2) zrobimy 2 wywołania
licz ˛ac fib(3) zrobimy 3 wywołania
licz ˛ac fib(4) zrobimy 5 wywoła ´n . . . licz ˛ac fib(n) zrobimy Fnwywoła ´n
Rekurencja Liczby Fibonacciego NWD Wie˙ze Hanoi szachownica Backtracking Analiza zło˙zono´sci
policzmy ile razy wywołamy fib(0) lub fib(1) licz ˛ac fib(n)
licz ˛ac fib(0) lub fib(1) zrobimy jedno wywołanie
licz ˛ac fib(2) zrobimy 2 wywołania
licz ˛ac fib(3) zrobimy 3 wywołania
licz ˛ac fib(4) zrobimy 5 wywoła ´n . . . licz ˛ac fib(n) zrobimy Fnwywoła ´n
Rekurencja Liczby Fibonacciego NWD Wie˙ze Hanoi szachownica Backtracking Analiza zło˙zono´sci
policzmy ile razy wywołamy fib(0) lub fib(1) licz ˛ac fib(n)
licz ˛ac fib(0) lub fib(1) zrobimy jedno wywołanie licz ˛ac fib(2) zrobimy 2 wywołania
licz ˛ac fib(3) zrobimy 3 wywołania
licz ˛ac fib(4) zrobimy 5 wywoła ´n . . . licz ˛ac fib(n) zrobimy Fnwywoła ´n
Rekurencja Liczby Fibonacciego NWD Wie˙ze Hanoi szachownica Backtracking Analiza zło˙zono´sci
policzmy ile razy wywołamy fib(0) lub fib(1) licz ˛ac fib(n)
licz ˛ac fib(0) lub fib(1) zrobimy jedno wywołanie licz ˛ac fib(2) zrobimy 2 wywołania
licz ˛ac fib(3) zrobimy 3 wywołania
licz ˛ac fib(4) zrobimy 5 wywoła ´n . . . licz ˛ac fib(n) zrobimy Fnwywoła ´n
Rekurencja Liczby Fibonacciego NWD Wie˙ze Hanoi szachownica Backtracking Analiza zło˙zono´sci
policzmy ile razy wywołamy fib(0) lub fib(1) licz ˛ac fib(n)
licz ˛ac fib(0) lub fib(1) zrobimy jedno wywołanie licz ˛ac fib(2) zrobimy 2 wywołania
licz ˛ac fib(3) zrobimy 3 wywołania licz ˛ac fib(4) zrobimy 5 wywoła ´n . . .
licz ˛ac fib(n) zrobimy Fnwywoła ´n
Rekurencja Liczby Fibonacciego NWD Wie˙ze Hanoi szachownica Backtracking Analiza zło˙zono´sci
policzmy ile razy wywołamy fib(0) lub fib(1) licz ˛ac fib(n)
licz ˛ac fib(0) lub fib(1) zrobimy jedno wywołanie licz ˛ac fib(2) zrobimy 2 wywołania
licz ˛ac fib(3) zrobimy 3 wywołania licz ˛ac fib(4) zrobimy 5 wywoła ´n . . . licz ˛ac fib(n) zrobimy Fnwywoła ´n
Rekurencja Liczby Fibonacciego NWD Wie˙ze Hanoi szachownica Backtracking Analiza zło˙zono´sci
policzmy ile razy wywołamy fib(0) lub fib(1) licz ˛ac fib(n)
licz ˛ac fib(0) lub fib(1) zrobimy jedno wywołanie licz ˛ac fib(2) zrobimy 2 wywołania
licz ˛ac fib(3) zrobimy 3 wywołania licz ˛ac fib(4) zrobimy 5 wywoła ´n . . . licz ˛ac fib(n) zrobimy Fnwywoła ´n
Rekurencja Liczby Fibonacciego NWD Wie˙ze Hanoi szachownica Backtracking
Jak szybko rosn ˛a?
Liczby Fibonacciego rosn ˛a wykładniczo. Dowód:
1 Fn+1 >Fn 2 F
n+2 =Fn+1+Fn=2Fn+Fn−1 2Fn 3 F
2n+2 F2n+1 2nF1=2n (czyli Fnrosn ˛a co najmniej
wykładniczo)
4 F
n+1 ¬ 2Fn, wi ˛ec Fn¬ 2n(czyli Fnrosn ˛a co najwy˙zej
Rekurencja Liczby Fibonacciego NWD Wie˙ze Hanoi szachownica Backtracking
Jak szybko rosn ˛a?
Liczby Fibonacciego rosn ˛a wykładniczo. Dowód:
1 Fn+1 >Fn 2 F
n+2 =Fn+1+Fn=2Fn+Fn−1 2Fn 3 F
2n+2 F2n+1 2nF1=2n (czyli Fnrosn ˛a co najmniej
wykładniczo)
4 F
n+1 ¬ 2Fn, wi ˛ec Fn¬ 2n(czyli Fnrosn ˛a co najwy˙zej
Rekurencja Liczby Fibonacciego NWD Wie˙ze Hanoi szachownica Backtracking
Jak szybko rosn ˛a?
Liczby Fibonacciego rosn ˛a wykładniczo. Dowód:
1 Fn+1 >Fn 2 F
n+2 =Fn+1+Fn=2Fn+Fn−1 2Fn 3 F
2n+2 F2n+1 2nF1=2n (czyli Fnrosn ˛a co najmniej
wykładniczo)
4 F
n+1 ¬ 2Fn, wi ˛ec Fn¬ 2n(czyli Fnrosn ˛a co najwy˙zej
Rekurencja Liczby Fibonacciego NWD Wie˙ze Hanoi szachownica Backtracking
Jak szybko rosn ˛a?
Liczby Fibonacciego rosn ˛a wykładniczo. Dowód:
1 Fn+1 >Fn 2 F
n+2 =Fn+1+Fn=2Fn+Fn−1 2Fn 3 F
2n+2 F2n+1 2nF1=2n (czyli Fnrosn ˛a co najmniej
wykładniczo)
4 F
n+1 ¬ 2Fn, wi ˛ec Fn¬ 2n(czyli Fnrosn ˛a co najwy˙zej
Rekurencja Liczby Fibonacciego NWD Wie˙ze Hanoi szachownica Backtracking
Jak szybko rosn ˛a?
Liczby Fibonacciego rosn ˛a wykładniczo. Dowód:
1 Fn+1 >Fn 2 F
n+2 =Fn+1+Fn=2Fn+Fn−1 2Fn 3 F
2n+2 F2n+1 2nF1=2n (czyli Fnrosn ˛a co najmniej
wykładniczo)
4 F
n+1 ¬ 2Fn, wi ˛ec Fn¬ 2n(czyli Fnrosn ˛a co najwy˙zej
Rekurencja Liczby Fibonacciego NWD Wie˙ze Hanoi szachownica Backtracking Jak to poprawi´c?
nie trzeba liczy´c tych samych warto´sci wielokrotnie
mo˙zemy zapisywa´c ju˙z policzone warto´sci w tablicy
Obliczanie Fn— 2. podej´scie int fib[MAXN+1]; fib[0]=fib[1]=1; for(int n=2;n<=MAXN;n++) fib[n]=fib[n-1]+fib[n-2]; Zło˙zono´s´c: O(n)
Rekurencja Liczby Fibonacciego NWD Wie˙ze Hanoi szachownica Backtracking Jak to poprawi´c?
nie trzeba liczy´c tych samych warto´sci wielokrotnie mo˙zemy zapisywa´c ju˙z policzone warto´sci w tablicy
Obliczanie Fn— 2. podej´scie int fib[MAXN+1]; fib[0]=fib[1]=1; for(int n=2;n<=MAXN;n++) fib[n]=fib[n-1]+fib[n-2]; Zło˙zono´s´c: O(n)
Rekurencja Liczby Fibonacciego NWD Wie˙ze Hanoi szachownica Backtracking Jak to poprawi´c?
nie trzeba liczy´c tych samych warto´sci wielokrotnie mo˙zemy zapisywa´c ju˙z policzone warto´sci w tablicy
Obliczanie Fn— 2. podej´scie int fib[MAXN+1]; fib[0]=fib[1]=1; for(int n=2;n<=MAXN;n++) fib[n]=fib[n-1]+fib[n-2]; Zło˙zono´s´c: O(n)
Rekurencja Liczby Fibonacciego NWD Wie˙ze Hanoi szachownica Backtracking Jak to poprawi´c?
nie trzeba liczy´c tych samych warto´sci wielokrotnie mo˙zemy zapisywa´c ju˙z policzone warto´sci w tablicy
Obliczanie Fn— 2. podej´scie int fib[MAXN+1]; fib[0]=fib[1]=1; for(int n=2;n<=MAXN;n++) fib[n]=fib[n-1]+fib[n-2]; Zło˙zono´s´c: O(n)
Rekurencja Liczby Fibonacciego NWD Wie˙ze Hanoi szachownica Backtracking Jak to poprawi´c?
nie trzeba liczy´c tych samych warto´sci wielokrotnie mo˙zemy zapisywa´c ju˙z policzone warto´sci w tablicy
Obliczanie Fn— 2. podej´scie int fib[MAXN+1]; fib[0]=fib[1]=1; for(int n=2;n<=MAXN;n++) fib[n]=fib[n-1]+fib[n-2]; Zło˙zono´s´c: O(n)
Rekurencja Liczby Fibonacciego NWD Wie˙ze Hanoi szachownica Backtracking
Najwi ˛ekszy wspólny dzielnik
Najwi ˛ekszym Wspólnym Dzielnikiem (NWD) dwóch liczb naturalnych a i b nazywamy najwi ˛eksz ˛a liczb ˛e naturaln ˛a dziel ˛ac ˛a zarówno a jak i b.
przykładowo NWD(35, 20) = 5 jak policzy´c NWD(a, b)?
mo˙zna sprawdzi´c wszystkie liczby 1, 2, . . . , min(a, b) — zło˙zono´s´c O(min(a, b))
Rekurencja Liczby Fibonacciego NWD Wie˙ze Hanoi szachownica Backtracking
Najwi ˛ekszy wspólny dzielnik
Najwi ˛ekszym Wspólnym Dzielnikiem (NWD) dwóch liczb naturalnych a i b nazywamy najwi ˛eksz ˛a liczb ˛e naturaln ˛a dziel ˛ac ˛a zarówno a jak i b.
przykładowo NWD(35, 20) = 5
jak policzy´c NWD(a, b)?
mo˙zna sprawdzi´c wszystkie liczby 1, 2, . . . , min(a, b) — zło˙zono´s´c O(min(a, b))
Rekurencja Liczby Fibonacciego NWD Wie˙ze Hanoi szachownica Backtracking
Najwi ˛ekszy wspólny dzielnik
Najwi ˛ekszym Wspólnym Dzielnikiem (NWD) dwóch liczb naturalnych a i b nazywamy najwi ˛eksz ˛a liczb ˛e naturaln ˛a dziel ˛ac ˛a zarówno a jak i b.
przykładowo NWD(35, 20) = 5 jak policzy´c NWD(a, b)?
mo˙zna sprawdzi´c wszystkie liczby 1, 2, . . . , min(a, b) — zło˙zono´s´c O(min(a, b))
Rekurencja Liczby Fibonacciego NWD Wie˙ze Hanoi szachownica Backtracking
Najwi ˛ekszy wspólny dzielnik
Najwi ˛ekszym Wspólnym Dzielnikiem (NWD) dwóch liczb naturalnych a i b nazywamy najwi ˛eksz ˛a liczb ˛e naturaln ˛a dziel ˛ac ˛a zarówno a jak i b.
przykładowo NWD(35, 20) = 5 jak policzy´c NWD(a, b)?
mo˙zna sprawdzi´c wszystkie liczby 1, 2, . . . , min(a, b) — zło˙zono´s´c O(min(a, b))
Rekurencja Liczby Fibonacciego NWD Wie˙ze Hanoi szachownica Backtracking Algorytm Euklidesa
int nwd(int a,int b){ if(b == 0) return a; return nwd(b, a%b); } Przykład działania nwd(20,35) =nwd(35,20) =nwd(20,15) =nwd(15,5) =nwd(5,0) =5
Rekurencja Liczby Fibonacciego NWD Wie˙ze Hanoi szachownica Backtracking Algorytm Euklidesa
int nwd(int a,int b){ if(b == 0) return a; return nwd(b, a%b); } Przykład działania nwd(20,35)=nwd(35,20) =nwd(20,15) =nwd(15,5) =nwd(5,0) =5
Rekurencja Liczby Fibonacciego NWD Wie˙ze Hanoi szachownica Backtracking Algorytm Euklidesa
int nwd(int a,int b){ if(b == 0) return a; return nwd(b, a%b); } Przykład działania nwd(20,35) =nwd(35,20)=nwd(20,15) =nwd(15,5) =nwd(5,0) =5
Rekurencja Liczby Fibonacciego NWD Wie˙ze Hanoi szachownica Backtracking Algorytm Euklidesa
int nwd(int a,int b){ if(b == 0) return a; return nwd(b, a%b); } Przykład działania nwd(20,35) =nwd(35,20) =nwd(20,15)=nwd(15,5) =nwd(5,0) =5
Rekurencja Liczby Fibonacciego NWD Wie˙ze Hanoi szachownica Backtracking Algorytm Euklidesa
int nwd(int a,int b){ if(b == 0) return a; return nwd(b, a%b); } Przykład działania nwd(20,35) =nwd(35,20) =nwd(20,15) =nwd(15,5) =nwd(5,0) =5
Rekurencja Liczby Fibonacciego NWD Wie˙ze Hanoi szachownica Backtracking Algorytm Euklidesa
int nwd(int a,int b){ if(b == 0) return a; return nwd(b, a%b); } Przykład działania nwd(20,35) =nwd(35,20) =nwd(20,15) =nwd(15,5) =nwd(5,0)=5
Rekurencja Liczby Fibonacciego NWD Wie˙ze Hanoi szachownica Backtracking Algorytm Euklidesa
int nwd(int a,int b){ if(b == 0) return a; return nwd(b, a%b); } Przykład działania nwd(20,35) =nwd(35,20) =nwd(20,15) =nwd(15,5) =nwd(5,0) =5
Rekurencja Liczby Fibonacciego NWD Wie˙ze Hanoi szachownica Backtracking if(b == 0) return a; return nwd(b, a%b); } Dlaczego to działa?
nie licz ˛ac pierwszego wywołania zachodzi b < a wówczas warto´s´c b maleje przy ka˙zdym wywołaniu, wi ˛ec algorytm si ˛e zatrzymuje
zachodzi NWD(a, b) = NWD(b, a mod b); dowód:
1 niech a = b · n + m, gdzie m < b
2 chcemy wykaza´c, ˙ze NWD(b · n + m, b) = NWD(b, m) 3 wspólne dzielniki b · n + m i b dziel ˛a te˙z m
Rekurencja Liczby Fibonacciego NWD Wie˙ze Hanoi szachownica Backtracking if(b == 0) return a; return nwd(b, a%b); } Dlaczego to działa?
nie licz ˛ac pierwszego wywołania zachodzi b < a
wówczas warto´s´c b maleje przy ka˙zdym wywołaniu, wi ˛ec algorytm si ˛e zatrzymuje
zachodzi NWD(a, b) = NWD(b, a mod b); dowód:
1 niech a = b · n + m, gdzie m < b
2 chcemy wykaza´c, ˙ze NWD(b · n + m, b) = NWD(b, m) 3 wspólne dzielniki b · n + m i b dziel ˛a te˙z m
Rekurencja Liczby Fibonacciego NWD Wie˙ze Hanoi szachownica Backtracking if(b == 0) return a; return nwd(b, a%b); } Dlaczego to działa?
nie licz ˛ac pierwszego wywołania zachodzi b < a wówczas warto´s´c b maleje przy ka˙zdym wywołaniu, wi ˛ec algorytm si ˛e zatrzymuje
zachodzi NWD(a, b) = NWD(b, a mod b); dowód:
1 niech a = b · n + m, gdzie m < b
2 chcemy wykaza´c, ˙ze NWD(b · n + m, b) = NWD(b, m) 3 wspólne dzielniki b · n + m i b dziel ˛a te˙z m
Rekurencja Liczby Fibonacciego NWD Wie˙ze Hanoi szachownica Backtracking if(b == 0) return a; return nwd(b, a%b); } Dlaczego to działa?
nie licz ˛ac pierwszego wywołania zachodzi b < a wówczas warto´s´c b maleje przy ka˙zdym wywołaniu, wi ˛ec algorytm si ˛e zatrzymuje
zachodzi NWD(a, b) = NWD(b, a mod b); dowód:
1 niech a = b · n + m, gdzie m < b
2 chcemy wykaza´c, ˙ze NWD(b · n + m, b) = NWD(b, m) 3 wspólne dzielniki b · n + m i b dziel ˛a te˙z m
Rekurencja Liczby Fibonacciego NWD Wie˙ze Hanoi szachownica Backtracking if(b == 0) return a; return nwd(b, a%b); } Dlaczego to działa?
nie licz ˛ac pierwszego wywołania zachodzi b < a wówczas warto´s´c b maleje przy ka˙zdym wywołaniu, wi ˛ec algorytm si ˛e zatrzymuje
zachodzi NWD(a, b) = NWD(b, a mod b); dowód:
1 niech a = b · n + m, gdzie m < b
2 chcemy wykaza´c, ˙ze NWD(b · n + m, b) = NWD(b, m) 3 wspólne dzielniki b · n + m i b dziel ˛a te˙z m
Rekurencja Liczby Fibonacciego NWD Wie˙ze Hanoi szachownica Backtracking if(b == 0) return a; return nwd(b, a%b); } Dlaczego to działa?
nie licz ˛ac pierwszego wywołania zachodzi b < a wówczas warto´s´c b maleje przy ka˙zdym wywołaniu, wi ˛ec algorytm si ˛e zatrzymuje
zachodzi NWD(a, b) = NWD(b, a mod b); dowód:
1 niech a = b · n + m, gdzie m < b
2 chcemy wykaza´c, ˙ze NWD(b · n + m, b) = NWD(b, m) 3 wspólne dzielniki b · n + m i b dziel ˛a te˙z m
Rekurencja Liczby Fibonacciego NWD Wie˙ze Hanoi szachownica Backtracking if(b == 0) return a; return nwd(b, a%b); } Dlaczego to działa?
nie licz ˛ac pierwszego wywołania zachodzi b < a wówczas warto´s´c b maleje przy ka˙zdym wywołaniu, wi ˛ec algorytm si ˛e zatrzymuje
zachodzi NWD(a, b) = NWD(b, a mod b); dowód:
1 niech a = b · n + m, gdzie m < b
2 chcemy wykaza´c, ˙ze NWD(b · n + m, b) = NWD(b, m) 3 wspólne dzielniki b · n + m i b dziel ˛a te˙z m
Rekurencja Liczby Fibonacciego NWD Wie˙ze Hanoi szachownica Backtracking if(b == 0) return a; return nwd(b, a%b); } Dlaczego to działa?
nie licz ˛ac pierwszego wywołania zachodzi b < a wówczas warto´s´c b maleje przy ka˙zdym wywołaniu, wi ˛ec algorytm si ˛e zatrzymuje
zachodzi NWD(a, b) = NWD(b, a mod b); dowód:
1 niech a = b · n + m, gdzie m < b
2 chcemy wykaza´c, ˙ze NWD(b · n + m, b) = NWD(b, m) 3 wspólne dzielniki b · n + m i b dziel ˛a te˙z m
Rekurencja Liczby Fibonacciego NWD Wie˙ze Hanoi szachownica Backtracking Zło˙zono´s´c
Algorytm Euklidesa działa w czasie O(log min(a, b)). Dowód pomijamy.
Rekurencja Liczby Fibonacciego NWD Wie˙ze Hanoi szachownica Backtracking Problem
mamy 3 kołki i n kr ˛a˙zków ró˙znej ´srednicy
sytuacj ˛e pocz ˛atkow ˛a przedstawia rysunek
zadanie pole na przeło˙zeniu wszystkich kr ˛a˙zków na
prawy kołek
mo˙zna przeło˙zy´c tylko jeden kr ˛a˙zek na raz nie mo˙zna kła´s´c kr ˛a˙zka wi ˛ekszego na mniejszy oznaczmy kr ˛a˙zki 1, 2, . . . n; 1 — najmniejszy
Rekurencja Liczby Fibonacciego NWD Wie˙ze Hanoi szachownica Backtracking Problem
mamy 3 kołki i n kr ˛a˙zków ró˙znej ´srednicy sytuacj ˛e pocz ˛atkow ˛a przedstawia rysunek
zadanie pole na przeło˙zeniu wszystkich kr ˛a˙zków na
prawy kołek
mo˙zna przeło˙zy´c tylko jeden kr ˛a˙zek na raz nie mo˙zna kła´s´c kr ˛a˙zka wi ˛ekszego na mniejszy oznaczmy kr ˛a˙zki 1, 2, . . . n; 1 — najmniejszy
Rekurencja Liczby Fibonacciego NWD Wie˙ze Hanoi szachownica Backtracking Problem
mamy 3 kołki i n kr ˛a˙zków ró˙znej ´srednicy sytuacj ˛e pocz ˛atkow ˛a przedstawia rysunek
zadanie pole na przeło˙zeniu wszystkich kr ˛a˙zków na prawy kołek
mo˙zna przeło˙zy´c tylko jeden kr ˛a˙zek na raz nie mo˙zna kła´s´c kr ˛a˙zka wi ˛ekszego na mniejszy oznaczmy kr ˛a˙zki 1, 2, . . . n; 1 — najmniejszy
Rekurencja Liczby Fibonacciego NWD Wie˙ze Hanoi szachownica Backtracking Problem
mamy 3 kołki i n kr ˛a˙zków ró˙znej ´srednicy sytuacj ˛e pocz ˛atkow ˛a przedstawia rysunek
zadanie pole na przeło˙zeniu wszystkich kr ˛a˙zków na prawy kołek
mo˙zna przeło˙zy´c tylko jeden kr ˛a˙zek na raz
nie mo˙zna kła´s´c kr ˛a˙zka wi ˛ekszego na mniejszy oznaczmy kr ˛a˙zki 1, 2, . . . n; 1 — najmniejszy
Rekurencja Liczby Fibonacciego NWD Wie˙ze Hanoi szachownica Backtracking Problem
mamy 3 kołki i n kr ˛a˙zków ró˙znej ´srednicy sytuacj ˛e pocz ˛atkow ˛a przedstawia rysunek
zadanie pole na przeło˙zeniu wszystkich kr ˛a˙zków na prawy kołek
mo˙zna przeło˙zy´c tylko jeden kr ˛a˙zek na raz nie mo˙zna kła´s´c kr ˛a˙zka wi ˛ekszego na mniejszy
Rekurencja Liczby Fibonacciego NWD Wie˙ze Hanoi szachownica Backtracking Problem
mamy 3 kołki i n kr ˛a˙zków ró˙znej ´srednicy sytuacj ˛e pocz ˛atkow ˛a przedstawia rysunek
zadanie pole na przeło˙zeniu wszystkich kr ˛a˙zków na prawy kołek
mo˙zna przeło˙zy´c tylko jeden kr ˛a˙zek na raz nie mo˙zna kła´s´c kr ˛a˙zka wi ˛ekszego na mniejszy oznaczmy kr ˛a˙zki 1, 2, . . . n; 1 — najmniejszy
Rekurencja
Liczby Fibonacciego NWD
Wie˙ze Hanoi
szachownica
Backtracking Rozwi ˛azanie
1mo˙zemy przemieszcza´c bez problemu
aby przesun ˛a´c 12 na 3. kołek, mo˙zemy:
1 przesun ˛a´c 1 na 2. kołek 2 przesun ˛a´c 2 na 3. kołek 3 przesun ˛a´c 1 na 3. kołek
aby przesun ˛a´c 123 na 3. kołek, mo˙zemy:
1 przesun ˛a´c 12 na 2. kołek (rekurencyjnie) 2 przesun ˛a´c 3 na 3. kołek
Rekurencja
Liczby Fibonacciego NWD
Wie˙ze Hanoi
szachownica
Backtracking Rozwi ˛azanie
1mo˙zemy przemieszcza´c bez problemu
aby przesun ˛a´c 12 na 3. kołek, mo˙zemy:
1 przesun ˛a´c 1 na 2. kołek 2 przesun ˛a´c 2 na 3. kołek 3 przesun ˛a´c 1 na 3. kołek
aby przesun ˛a´c 123 na 3. kołek, mo˙zemy:
1 przesun ˛a´c 12 na 2. kołek (rekurencyjnie) 2 przesun ˛a´c 3 na 3. kołek
Rekurencja
Liczby Fibonacciego NWD
Wie˙ze Hanoi
szachownica
Backtracking Rozwi ˛azanie
1mo˙zemy przemieszcza´c bez problemu aby przesun ˛a´c 12 na 3. kołek, mo˙zemy:
1 przesun ˛a´c 1 na 2. kołek 2 przesun ˛a´c 2 na 3. kołek 3 przesun ˛a´c 1 na 3. kołek
aby przesun ˛a´c 123 na 3. kołek, mo˙zemy:
1 przesun ˛a´c 12 na 2. kołek (rekurencyjnie) 2 przesun ˛a´c 3 na 3. kołek
Rekurencja
Liczby Fibonacciego NWD
Wie˙ze Hanoi
szachownica
Backtracking Rozwi ˛azanie
1mo˙zemy przemieszcza´c bez problemu aby przesun ˛a´c 12 na 3. kołek, mo˙zemy:
1 przesun ˛a´c 1 na 2. kołek 2 przesun ˛a´c 2 na 3. kołek 3 przesun ˛a´c 1 na 3. kołek
aby przesun ˛a´c 123 na 3. kołek, mo˙zemy:
1 przesun ˛a´c 12 na 2. kołek (rekurencyjnie) 2 przesun ˛a´c 3 na 3. kołek
Rekurencja
Liczby Fibonacciego NWD
Wie˙ze Hanoi
szachownica
Backtracking Rozwi ˛azanie
1mo˙zemy przemieszcza´c bez problemu aby przesun ˛a´c 12 na 3. kołek, mo˙zemy:
1 przesun ˛a´c 1 na 2. kołek 2 przesun ˛a´c 2 na 3. kołek 3 przesun ˛a´c 1 na 3. kołek
aby przesun ˛a´c 123 na 3. kołek, mo˙zemy:
1 przesun ˛a´c 12 na 2. kołek (rekurencyjnie) 2 przesun ˛a´c 3 na 3. kołek
Rekurencja
Liczby Fibonacciego NWD
Wie˙ze Hanoi
szachownica
Backtracking Rozwi ˛azanie
1mo˙zemy przemieszcza´c bez problemu aby przesun ˛a´c 12 na 3. kołek, mo˙zemy:
1 przesun ˛a´c 1 na 2. kołek 2 przesun ˛a´c 2 na 3. kołek 3 przesun ˛a´c 1 na 3. kołek
aby przesun ˛a´c 123 na 3. kołek, mo˙zemy:
1 przesun ˛a´c 12 na 2. kołek (rekurencyjnie) 2 przesun ˛a´c 3 na 3. kołek
Rekurencja
Liczby Fibonacciego NWD
Wie˙ze Hanoi
szachownica
Backtracking Rozwi ˛azanie
1mo˙zemy przemieszcza´c bez problemu aby przesun ˛a´c 12 na 3. kołek, mo˙zemy:
1 przesun ˛a´c 1 na 2. kołek 2 przesun ˛a´c 2 na 3. kołek 3 przesun ˛a´c 1 na 3. kołek
aby przesun ˛a´c 123 na 3. kołek, mo˙zemy:
1 przesun ˛a´c 12 na 2. kołek (rekurencyjnie) 2 przesun ˛a´c 3 na 3. kołek
Rekurencja
Liczby Fibonacciego NWD
Wie˙ze Hanoi
szachownica
Backtracking Rozwi ˛azanie
1mo˙zemy przemieszcza´c bez problemu aby przesun ˛a´c 12 na 3. kołek, mo˙zemy:
1 przesun ˛a´c 1 na 2. kołek 2 przesun ˛a´c 2 na 3. kołek 3 przesun ˛a´c 1 na 3. kołek
aby przesun ˛a´c 123 na 3. kołek, mo˙zemy:
1 przesun ˛a´c 12 na 2. kołek (rekurencyjnie) 2 przesun ˛a´c 3 na 3. kołek
Rekurencja
Liczby Fibonacciego NWD
Wie˙ze Hanoi
szachownica
Backtracking Rozwi ˛azanie
1mo˙zemy przemieszcza´c bez problemu aby przesun ˛a´c 12 na 3. kołek, mo˙zemy:
1 przesun ˛a´c 1 na 2. kołek 2 przesun ˛a´c 2 na 3. kołek 3 przesun ˛a´c 1 na 3. kołek
aby przesun ˛a´c 123 na 3. kołek, mo˙zemy:
1 przesun ˛a´c 12 na 2. kołek (rekurencyjnie) 2 przesun ˛a´c 3 na 3. kołek
Rekurencja
Liczby Fibonacciego NWD
Wie˙ze Hanoi
szachownica
Backtracking Rozwi ˛azanie
1mo˙zemy przemieszcza´c bez problemu aby przesun ˛a´c 12 na 3. kołek, mo˙zemy:
1 przesun ˛a´c 1 na 2. kołek 2 przesun ˛a´c 2 na 3. kołek 3 przesun ˛a´c 1 na 3. kołek
aby przesun ˛a´c 123 na 3. kołek, mo˙zemy:
1 przesun ˛a´c 12 na 2. kołek (rekurencyjnie) 2 przesun ˛a´c 3 na 3. kołek
Rekurencja
Liczby Fibonacciego NWD
Wie˙ze Hanoi
szachownica
Backtracking Rozwi ˛azanie rekurencyjne:
hanoi(m,k)— przeniesienie 12...m w kierunku k ,
gdzie k = 1 oznacza przesuni ˛ecie na prawo a k = −1 na lewo od obecnej pozycji (cyklicznie)
chcemy wykona´c hanoi(n,-1) hanoi(m,k):
1 je´sli m = 1, to przesu ´n 1 i sko ´ncz 2 hanoi(m-1,-k)
3 przesu ´n m w kierunku k 4 hanoi(m-1,-k)
Rekurencja
Liczby Fibonacciego NWD
Wie˙ze Hanoi
szachownica
Backtracking Rozwi ˛azanie rekurencyjne:
hanoi(m,k)— przeniesienie 12...m w kierunku k , gdzie k = 1 oznacza przesuni ˛ecie na prawo a k = −1 na lewo od obecnej pozycji (cyklicznie)
chcemy wykona´c hanoi(n,-1) hanoi(m,k):
1 je´sli m = 1, to przesu ´n 1 i sko ´ncz 2 hanoi(m-1,-k)
3 przesu ´n m w kierunku k 4 hanoi(m-1,-k)
Rekurencja
Liczby Fibonacciego NWD
Wie˙ze Hanoi
szachownica
Backtracking Rozwi ˛azanie rekurencyjne:
hanoi(m,k)— przeniesienie 12...m w kierunku k , gdzie k = 1 oznacza przesuni ˛ecie na prawo a k = −1 na lewo od obecnej pozycji (cyklicznie)
chcemy wykona´c hanoi(n,-1)
hanoi(m,k):
1 je´sli m = 1, to przesu ´n 1 i sko ´ncz 2 hanoi(m-1,-k)
3 przesu ´n m w kierunku k 4 hanoi(m-1,-k)
Rekurencja
Liczby Fibonacciego NWD
Wie˙ze Hanoi
szachownica
Backtracking Rozwi ˛azanie rekurencyjne:
hanoi(m,k)— przeniesienie 12...m w kierunku k , gdzie k = 1 oznacza przesuni ˛ecie na prawo a k = −1 na lewo od obecnej pozycji (cyklicznie)
chcemy wykona´c hanoi(n,-1) hanoi(m,k):
1 je´sli m = 1, to przesu ´n 1 i sko ´ncz
2 hanoi(m-1,-k)
3 przesu ´n m w kierunku k
Rekurencja
Liczby Fibonacciego NWD
Wie˙ze Hanoi
szachownica
Backtracking Rozwi ˛azanie rekurencyjne:
hanoi(m,k)— przeniesienie 12...m w kierunku k , gdzie k = 1 oznacza przesuni ˛ecie na prawo a k = −1 na lewo od obecnej pozycji (cyklicznie)
chcemy wykona´c hanoi(n,-1) hanoi(m,k):
1 je´sli m = 1, to przesu ´n 1 i sko ´ncz
2 hanoi(m-1,-k)
3 przesu ´n m w kierunku k
Rekurencja
Liczby Fibonacciego NWD
Wie˙ze Hanoi
szachownica
Backtracking Rozwi ˛azanie rekurencyjne:
hanoi(m,k)— przeniesienie 12...m w kierunku k , gdzie k = 1 oznacza przesuni ˛ecie na prawo a k = −1 na lewo od obecnej pozycji (cyklicznie)
chcemy wykona´c hanoi(n,-1) hanoi(m,k):
1 je´sli m = 1, to przesu ´n 1 i sko ´ncz 2 hanoi(m-1,-k)
3 przesu ´n m w kierunku k
Rekurencja
Liczby Fibonacciego NWD
Wie˙ze Hanoi
szachownica
Backtracking Rozwi ˛azanie rekurencyjne:
hanoi(m,k)— przeniesienie 12...m w kierunku k , gdzie k = 1 oznacza przesuni ˛ecie na prawo a k = −1 na lewo od obecnej pozycji (cyklicznie)
chcemy wykona´c hanoi(n,-1) hanoi(m,k):
1 je´sli m = 1, to przesu ´n 1 i sko ´ncz 2 hanoi(m-1,-k)
3 przesu ´n m w kierunku k
Rekurencja
Liczby Fibonacciego NWD
Wie˙ze Hanoi
szachownica
Backtracking Rozwi ˛azanie rekurencyjne:
hanoi(m,k)— przeniesienie 12...m w kierunku k , gdzie k = 1 oznacza przesuni ˛ecie na prawo a k = −1 na lewo od obecnej pozycji (cyklicznie)
chcemy wykona´c hanoi(n,-1) hanoi(m,k):
1 je´sli m = 1, to przesu ´n 1 i sko ´ncz 2 hanoi(m-1,-k)
3 przesu ´n m w kierunku k 4 hanoi(m-1,-k)
Rekurencja Liczby Fibonacciego NWD Wie˙ze Hanoi szachownica Backtracking
Tn— liczba ruchów które wykonujemy przy
przenoszeniu 12...n T1=1 Tn=2 · Tn− 1 + 1 dla n > 1 n 1 2 3 4 5 Tn 1 3 7 15 31 teza: Tn=2n− 1
dowód przez indukcj ˛e:
baza: T1=1 = 21− 1
krok indukcyjny:
Rekurencja Liczby Fibonacciego NWD Wie˙ze Hanoi szachownica Backtracking
Tn— liczba ruchów które wykonujemy przy
przenoszeniu 12...n T1=1 Tn=2 · Tn− 1 + 1 dla n > 1 n 1 2 3 4 5 Tn 1 3 7 15 31 teza: Tn=2n− 1
dowód przez indukcj ˛e:
baza: T1=1 = 21− 1
krok indukcyjny:
Rekurencja Liczby Fibonacciego NWD Wie˙ze Hanoi szachownica Backtracking
Tn— liczba ruchów które wykonujemy przy
przenoszeniu 12...n T1=1 Tn=2 · Tn− 1 + 1 dla n > 1 n 1 2 3 4 5 Tn 1 3 7 15 31 teza: Tn=2n− 1
dowód przez indukcj ˛e:
baza: T1=1 = 21− 1
krok indukcyjny:
Rekurencja Liczby Fibonacciego NWD Wie˙ze Hanoi szachownica Backtracking
Tn— liczba ruchów które wykonujemy przy
przenoszeniu 12...n T1=1 Tn=2 · Tn− 1 + 1 dla n > 1 n 1 2 3 4 5 Tn 1 3 7 15 31 teza: Tn=2n− 1
dowód przez indukcj ˛e:
baza: T1=1 = 21− 1
krok indukcyjny:
Rekurencja Liczby Fibonacciego NWD Wie˙ze Hanoi szachownica Backtracking
Tn— liczba ruchów które wykonujemy przy
przenoszeniu 12...n T1=1 Tn=2 · Tn− 1 + 1 dla n > 1 n 1 2 3 4 5 Tn 1 3 7 15 31 teza: Tn=2n− 1
dowód przez indukcj ˛e:
baza: T1=1 = 21− 1
krok indukcyjny:
Rekurencja Liczby Fibonacciego NWD Wie˙ze Hanoi szachownica Backtracking
Tn— liczba ruchów które wykonujemy przy
przenoszeniu 12...n T1=1 Tn=2 · Tn− 1 + 1 dla n > 1 n 1 2 3 4 5 Tn 1 3 7 15 31 teza: Tn=2n− 1
dowód przez indukcj ˛e:
baza: T1=1 = 21− 1
krok indukcyjny:
Rekurencja Liczby Fibonacciego NWD Wie˙ze Hanoi szachownica Backtracking
Tn— liczba ruchów które wykonujemy przy
przenoszeniu 12...n T1=1 Tn=2 · Tn− 1 + 1 dla n > 1 n 1 2 3 4 5 Tn 1 3 7 15 31 teza: Tn=2n− 1
dowód przez indukcj ˛e:
baza: T1=1 = 21− 1 krok indukcyjny:
Rekurencja Liczby Fibonacciego NWD Wie˙ze Hanoi szachownica Backtracking
Tn— liczba ruchów które wykonujemy przy
przenoszeniu 12...n T1=1 Tn=2 · Tn− 1 + 1 dla n > 1 n 1 2 3 4 5 Tn 1 3 7 15 31 teza: Tn=2n− 1
dowód przez indukcj ˛e:
baza: T1=1 = 21− 1
krok indukcyjny:
Rekurencja Liczby Fibonacciego NWD Wie˙ze Hanoi szachownica Backtracking
Z szachownicy 2 x2 wyci ˛eto jedno pole. Jak za pomoc ˛a klocków w kształcie litery L (zajmuj ˛acych 3 pola) pokry´c tak ˛a szachownic ˛e?
Rozwi ˛azanie
1 je´sli n = 1, to zadanie jest łatwe
2 je´sli n > 1, to podzielmy nasz ˛a szachownic ˛e na cztery szachownice 2n−1x2n−1(pozioma i pionowa linia przechodz ˛aca przez ´srodek planszy)
3 w ´srodkowym kwadracie 2x2 układamy L w taki sposób, aby w ka˙zdej mniejszej szachownicy dokładnie jedno pole było zaj ˛ete (licz ˛ac to wyci ˛ete na wst ˛epie)
Rekurencja Liczby Fibonacciego NWD Wie˙ze Hanoi szachownica Backtracking
Z szachownicy 2 x2 wyci ˛eto jedno pole. Jak za pomoc ˛a klocków w kształcie litery L (zajmuj ˛acych 3 pola) pokry´c tak ˛a szachownic ˛e?
Rozwi ˛azanie
1 je´sli n = 1, to zadanie jest łatwe
2 je´sli n > 1, to podzielmy nasz ˛a szachownic ˛e na cztery
szachownice 2n−1x2n−1(pozioma i pionowa linia
przechodz ˛aca przez ´srodek planszy)
3 w ´srodkowym kwadracie 2x2 układamy L w taki sposób,
aby w ka˙zdej mniejszej szachownicy dokładnie jedno pole było zaj ˛ete (licz ˛ac to wyci ˛ete na wst ˛epie)
Rekurencja Liczby Fibonacciego NWD Wie˙ze Hanoi szachownica Backtracking
Z szachownicy 2 x2 wyci ˛eto jedno pole. Jak za pomoc ˛a klocków w kształcie litery L (zajmuj ˛acych 3 pola) pokry´c tak ˛a szachownic ˛e?
Rozwi ˛azanie
1 je´sli n = 1, to zadanie jest łatwe
2 je´sli n > 1, to podzielmy nasz ˛a szachownic ˛e na cztery
szachownice 2n−1x2n−1(pozioma i pionowa linia przechodz ˛aca przez ´srodek planszy)
3 w ´srodkowym kwadracie 2x2 układamy L w taki sposób,
aby w ka˙zdej mniejszej szachownicy dokładnie jedno pole było zaj ˛ete (licz ˛ac to wyci ˛ete na wst ˛epie)
Rekurencja Liczby Fibonacciego NWD Wie˙ze Hanoi szachownica Backtracking
Z szachownicy 2 x2 wyci ˛eto jedno pole. Jak za pomoc ˛a klocków w kształcie litery L (zajmuj ˛acych 3 pola) pokry´c tak ˛a szachownic ˛e?
Rozwi ˛azanie
1 je´sli n = 1, to zadanie jest łatwe
2 je´sli n > 1, to podzielmy nasz ˛a szachownic ˛e na cztery
szachownice 2n−1x2n−1(pozioma i pionowa linia przechodz ˛aca przez ´srodek planszy)
3 w ´srodkowym kwadracie 2x2 układamy L w taki sposób,
aby w ka˙zdej mniejszej szachownicy dokładnie jedno pole było zaj ˛ete (licz ˛ac to wyci ˛ete na wst ˛epie)
Rekurencja Liczby Fibonacciego NWD Wie˙ze Hanoi szachownica Backtracking
Z szachownicy 2 x2 wyci ˛eto jedno pole. Jak za pomoc ˛a klocków w kształcie litery L (zajmuj ˛acych 3 pola) pokry´c tak ˛a szachownic ˛e?
Rozwi ˛azanie
1 je´sli n = 1, to zadanie jest łatwe
2 je´sli n > 1, to podzielmy nasz ˛a szachownic ˛e na cztery
szachownice 2n−1x2n−1(pozioma i pionowa linia przechodz ˛aca przez ´srodek planszy)
3 w ´srodkowym kwadracie 2x2 układamy L w taki sposób,
aby w ka˙zdej mniejszej szachownicy dokładnie jedno pole było zaj ˛ete (licz ˛ac to wyci ˛ete na wst ˛epie)
Rekurencja Liczby Fibonacciego NWD Wie˙ze Hanoi szachownica Backtracking
Czy da si ˛e ustawi´c na szachownicy 8 hetmanów, tak aby nie atakowały si ˛e wzajemnie? Hetman atakuje wszystkie pola le˙z ˛ace w tym samym wierszu, kolumnie lub na tej samej przek ˛atnej.
Zbiór rozwi ˛aza ´n
Jest to typowy problem w którym mamy pewien zbiór mo˙zliwych rozwi ˛aza ´n — zbiór ustawie ´n 8 hetmanów na szachownicy i szukamy jednego lub wszystkich rozwi ˛aza ´n, które spełniaj ˛a jaki´s warunek — w tym przypadku hetmany si ˛e nie atakuj ˛a.
Rekurencja Liczby Fibonacciego NWD Wie˙ze Hanoi szachownica Backtracking
Czy da si ˛e ustawi´c na szachownicy 8 hetmanów, tak aby nie atakowały si ˛e wzajemnie? Hetman atakuje wszystkie pola le˙z ˛ace w tym samym wierszu, kolumnie lub na tej samej przek ˛atnej.
Zbiór rozwi ˛aza ´n
Jest to typowy problem w którym mamy pewien zbiór mo˙zliwych rozwi ˛aza ´n — zbiór ustawie ´n 8 hetmanów na szachownicy i szukamy jednego lub wszystkich rozwi ˛aza ´n, które spełniaj ˛a jaki´s warunek — w tym przypadku hetmany si ˛e nie atakuj ˛a.
Rekurencja Liczby Fibonacciego NWD Wie˙ze Hanoi szachownica Backtracking Rozwi ˛azanie
najprostszym rozwi ˛azaniem jest sprawdzenie wszystkich mo˙zliwych rozstawie ´n hetmanów
zauwa˙zmy jednak, ˙ze je´sli pierwsze dwa postawione hetmany si ˛e atakuj ˛a, to nie ma sensu próbowa´c rozstawi´c pozostałych 6, gdy˙z taki układ nigdy nie spełni naszych warunków
mo˙zemy konstruowa´c rozwi ˛azanie, zaczynaj ˛ac od
pustej planszy i rozbudowuj ˛ac je o kolejne hetmany
kiedy jednak dwa ju˙z postawione hetmany b ˛ed ˛a si ˛e biły to mo˙zemy pomin ˛a´c tak ˛a konfiguracj ˛e
Rekurencja Liczby Fibonacciego NWD Wie˙ze Hanoi szachownica Backtracking Rozwi ˛azanie
najprostszym rozwi ˛azaniem jest sprawdzenie wszystkich mo˙zliwych rozstawie ´n hetmanów
zauwa˙zmy jednak, ˙ze je´sli pierwsze dwa postawione hetmany si ˛e atakuj ˛a, to nie ma sensu próbowa´c rozstawi´c pozostałych 6, gdy˙z taki układ nigdy nie spełni naszych warunków
mo˙zemy konstruowa´c rozwi ˛azanie, zaczynaj ˛ac od
pustej planszy i rozbudowuj ˛ac je o kolejne hetmany
kiedy jednak dwa ju˙z postawione hetmany b ˛ed ˛a si ˛e biły to mo˙zemy pomin ˛a´c tak ˛a konfiguracj ˛e
Rekurencja Liczby Fibonacciego NWD Wie˙ze Hanoi szachownica Backtracking Rozwi ˛azanie
najprostszym rozwi ˛azaniem jest sprawdzenie wszystkich mo˙zliwych rozstawie ´n hetmanów
zauwa˙zmy jednak, ˙ze je´sli pierwsze dwa postawione hetmany si ˛e atakuj ˛a, to nie ma sensu próbowa´c rozstawi´c pozostałych 6, gdy˙z taki układ nigdy nie spełni naszych warunków
mo˙zemy konstruowa´c rozwi ˛azanie, zaczynaj ˛ac od pustej planszy i rozbudowuj ˛ac je o kolejne hetmany
kiedy jednak dwa ju˙z postawione hetmany b ˛ed ˛a si ˛e biły to mo˙zemy pomin ˛a´c tak ˛a konfiguracj ˛e
Rekurencja Liczby Fibonacciego NWD Wie˙ze Hanoi szachownica Backtracking Rozwi ˛azanie
najprostszym rozwi ˛azaniem jest sprawdzenie wszystkich mo˙zliwych rozstawie ´n hetmanów
zauwa˙zmy jednak, ˙ze je´sli pierwsze dwa postawione hetmany si ˛e atakuj ˛a, to nie ma sensu próbowa´c rozstawi´c pozostałych 6, gdy˙z taki układ nigdy nie spełni naszych warunków
mo˙zemy konstruowa´c rozwi ˛azanie, zaczynaj ˛ac od pustej planszy i rozbudowuj ˛ac je o kolejne hetmany kiedy jednak dwa ju˙z postawione hetmany b ˛ed ˛a si ˛e biły to mo˙zemy pomin ˛a´c tak ˛a konfiguracj ˛e
Rekurencja Liczby Fibonacciego NWD Wie˙ze Hanoi szachownica Backtracking
rozwi ˛azania i szuka´c tych, które spełniaj ˛a pewne warunki
polega ona na stopniowym rozbudowywaniu rozwi ˛azania (dodawanie hetmanów)
je´sli jednak aktualne rozwi ˛azanie nie mo˙ze by´c rozbudowane (2 hetmany si ˛e szachuj ˛a), to nast ˛epuje powrót do poprzedniego kroku, gdzie podejmowana jest próba znalezienia innej mo˙zliwo´sci
proces ten mo˙zna zapisa´c rekurencyjnie — aby przetworzy´c rozwi ˛azanie x :
1 je´sli x jest dobrym rozwi ˛azaniem to je wypisz 2 je´sli x nie mo˙ze by´c rozbudowane to sko ´ncz 3 spróbuj wszystkich mo˙zliwo´sci rozbudowania x i
Rekurencja Liczby Fibonacciego NWD Wie˙ze Hanoi szachownica Backtracking
rozwi ˛azania i szuka´c tych, które spełniaj ˛a pewne warunki
polega ona na stopniowym rozbudowywaniu rozwi ˛azania (dodawanie hetmanów)
je´sli jednak aktualne rozwi ˛azanie nie mo˙ze by´c rozbudowane (2 hetmany si ˛e szachuj ˛a), to nast ˛epuje powrót do poprzedniego kroku, gdzie podejmowana jest próba znalezienia innej mo˙zliwo´sci
proces ten mo˙zna zapisa´c rekurencyjnie — aby przetworzy´c rozwi ˛azanie x :
1 je´sli x jest dobrym rozwi ˛azaniem to je wypisz 2 je´sli x nie mo˙ze by´c rozbudowane to sko ´ncz 3 spróbuj wszystkich mo˙zliwo´sci rozbudowania x i
Rekurencja Liczby Fibonacciego NWD Wie˙ze Hanoi szachownica Backtracking
rozwi ˛azania i szuka´c tych, które spełniaj ˛a pewne warunki
polega ona na stopniowym rozbudowywaniu rozwi ˛azania (dodawanie hetmanów)
je´sli jednak aktualne rozwi ˛azanie nie mo˙ze by´c rozbudowane (2 hetmany si ˛e szachuj ˛a), to nast ˛epuje powrót do poprzedniego kroku, gdzie podejmowana jest próba znalezienia innej mo˙zliwo´sci
proces ten mo˙zna zapisa´c rekurencyjnie — aby przetworzy´c rozwi ˛azanie x :
1 je´sli x jest dobrym rozwi ˛azaniem to je wypisz 2 je´sli x nie mo˙ze by´c rozbudowane to sko ´ncz 3 spróbuj wszystkich mo˙zliwo´sci rozbudowania x i
Rekurencja Liczby Fibonacciego NWD Wie˙ze Hanoi szachownica Backtracking
rozwi ˛azania i szuka´c tych, które spełniaj ˛a pewne warunki
polega ona na stopniowym rozbudowywaniu rozwi ˛azania (dodawanie hetmanów)
je´sli jednak aktualne rozwi ˛azanie nie mo˙ze by´c rozbudowane (2 hetmany si ˛e szachuj ˛a), to nast ˛epuje powrót do poprzedniego kroku, gdzie podejmowana jest próba znalezienia innej mo˙zliwo´sci
proces ten mo˙zna zapisa´c rekurencyjnie — aby przetworzy´c rozwi ˛azanie x :
1 je´sli x jest dobrym rozwi ˛azaniem to je wypisz 2 je´sli x nie mo˙ze by´c rozbudowane to sko ´ncz 3 spróbuj wszystkich mo˙zliwo´sci rozbudowania x i
Rekurencja Liczby Fibonacciego NWD Wie˙ze Hanoi szachownica Backtracking
rozwi ˛azania i szuka´c tych, które spełniaj ˛a pewne warunki
polega ona na stopniowym rozbudowywaniu rozwi ˛azania (dodawanie hetmanów)
je´sli jednak aktualne rozwi ˛azanie nie mo˙ze by´c rozbudowane (2 hetmany si ˛e szachuj ˛a), to nast ˛epuje powrót do poprzedniego kroku, gdzie podejmowana jest próba znalezienia innej mo˙zliwo´sci
proces ten mo˙zna zapisa´c rekurencyjnie — aby przetworzy´c rozwi ˛azanie x :
1 je´sli x jest dobrym rozwi ˛azaniem to je wypisz 2 je´sli x nie mo˙ze by´c rozbudowane to sko ´ncz 3 spróbuj wszystkich mo˙zliwo´sci rozbudowania x i
Rekurencja Liczby Fibonacciego NWD Wie˙ze Hanoi szachownica Backtracking
rozwi ˛azania i szuka´c tych, które spełniaj ˛a pewne warunki
polega ona na stopniowym rozbudowywaniu rozwi ˛azania (dodawanie hetmanów)
je´sli jednak aktualne rozwi ˛azanie nie mo˙ze by´c rozbudowane (2 hetmany si ˛e szachuj ˛a), to nast ˛epuje powrót do poprzedniego kroku, gdzie podejmowana jest próba znalezienia innej mo˙zliwo´sci
proces ten mo˙zna zapisa´c rekurencyjnie — aby przetworzy´c rozwi ˛azanie x :
1 je´sli x jest dobrym rozwi ˛azaniem to je wypisz 2 je´sli x nie mo˙ze by´c rozbudowane to sko ´ncz 3 spróbuj wszystkich mo˙zliwo´sci rozbudowania x i
Rekurencja Liczby Fibonacciego NWD Wie˙ze Hanoi szachownica Backtracking
rozwi ˛azania i szuka´c tych, które spełniaj ˛a pewne warunki
polega ona na stopniowym rozbudowywaniu rozwi ˛azania (dodawanie hetmanów)
je´sli jednak aktualne rozwi ˛azanie nie mo˙ze by´c rozbudowane (2 hetmany si ˛e szachuj ˛a), to nast ˛epuje powrót do poprzedniego kroku, gdzie podejmowana jest próba znalezienia innej mo˙zliwo´sci
proces ten mo˙zna zapisa´c rekurencyjnie — aby przetworzy´c rozwi ˛azanie x :
1 je´sli x jest dobrym rozwi ˛azaniem to je wypisz 2 je´sli x nie mo˙ze by´c rozbudowane to sko ´ncz 3 spróbuj wszystkich mo˙zliwo´sci rozbudowania x i
Rekurencja Liczby Fibonacciego NWD Wie˙ze Hanoi szachownica Backtracking Szczegóły implementacyjne
w ka˙zdym wierszu mo˙ze sta´c co najwy˙zej jeden hetman
aktualne rozwi ˛azanie mo˙zemy trzyma´c jako tablic ˛e 8 liczb; het[i] oznacza poło˙zenie hetmana w i-tym wierszu
b ˛edziemy dostawia´c kolejne hetmany w kolejnych wierszach, dzi ˛eki czemu ka˙zde rozstawienie hetmanów b ˛edziemy mogli otrzyma´c tylko na jeden sposób
Rekurencja Liczby Fibonacciego NWD Wie˙ze Hanoi szachownica Backtracking Szczegóły implementacyjne
w ka˙zdym wierszu mo˙ze sta´c co najwy˙zej jeden hetman aktualne rozwi ˛azanie mo˙zemy trzyma´c jako tablic ˛e 8 liczb; het[i] oznacza poło˙zenie hetmana w i-tym wierszu
b ˛edziemy dostawia´c kolejne hetmany w kolejnych wierszach, dzi ˛eki czemu ka˙zde rozstawienie hetmanów b ˛edziemy mogli otrzyma´c tylko na jeden sposób
Rekurencja Liczby Fibonacciego NWD Wie˙ze Hanoi szachownica Backtracking Szczegóły implementacyjne
w ka˙zdym wierszu mo˙ze sta´c co najwy˙zej jeden hetman aktualne rozwi ˛azanie mo˙zemy trzyma´c jako tablic ˛e 8 liczb; het[i] oznacza poło˙zenie hetmana w i-tym wierszu
b ˛edziemy dostawia´c kolejne hetmany w kolejnych wierszach, dzi ˛eki czemu ka˙zde rozstawienie hetmanów b ˛edziemy mogli otrzyma´c tylko na jeden sposób
Rekurencja Liczby Fibonacciego NWD Wie˙ze Hanoi szachownica Backtracking Implementacja
Program rozstawiaj ˛acy 8 hetmanów na szachownicy znajduje si ˛e w notatkach.
Rekurencja Liczby Fibonacciego NWD Wie˙ze Hanoi szachownica Backtracking
Dlaczego warto stosowa´c backtracking?
dzi ˛eki pomijaniu całych grup rozwi ˛aza ´n wystarczy przejrze´c o wiele mniej konfiguracji ni˙z w rozwi ˛azaniu brutalnym
w przypadku problemu 8 hetmanów u˙zywaj ˛ac
przeszukiwania z nawrotami mo˙zna przy odrobinie cierpliwo´sci znale´z´c poprawne ustawienie bez u˙zycia komputera
pomimo trudno´sci oszacowania zło˙zono´sci rozwi ˛aza ´n
opartych na poszukiwaniu z nawrotami, zazwyczaj działaj ˛a one du˙zo szybciej ni˙z rozwi ˛azania brutalne
Rekurencja Liczby Fibonacciego NWD Wie˙ze Hanoi szachownica Backtracking
Dlaczego warto stosowa´c backtracking?
dzi ˛eki pomijaniu całych grup rozwi ˛aza ´n wystarczy przejrze´c o wiele mniej konfiguracji ni˙z w rozwi ˛azaniu brutalnym
w przypadku problemu 8 hetmanów u˙zywaj ˛ac przeszukiwania z nawrotami mo˙zna przy odrobinie cierpliwo´sci znale´z´c poprawne ustawienie bez u˙zycia komputera
pomimo trudno´sci oszacowania zło˙zono´sci rozwi ˛aza ´n
opartych na poszukiwaniu z nawrotami, zazwyczaj działaj ˛a one du˙zo szybciej ni˙z rozwi ˛azania brutalne
Rekurencja Liczby Fibonacciego NWD Wie˙ze Hanoi szachownica Backtracking
Dlaczego warto stosowa´c backtracking?
dzi ˛eki pomijaniu całych grup rozwi ˛aza ´n wystarczy przejrze´c o wiele mniej konfiguracji ni˙z w rozwi ˛azaniu brutalnym
w przypadku problemu 8 hetmanów u˙zywaj ˛ac przeszukiwania z nawrotami mo˙zna przy odrobinie cierpliwo´sci znale´z´c poprawne ustawienie bez u˙zycia komputera
pomimo trudno´sci oszacowania zło˙zono´sci rozwi ˛aza ´n opartych na poszukiwaniu z nawrotami, zazwyczaj działaj ˛a one du˙zo szybciej ni˙z rozwi ˛azania brutalne
Rekurencja Liczby Fibonacciego NWD Wie˙ze Hanoi szachownica Backtracking
omówili´smy ju˙z 3 wa˙zne techniki programowania:
backtracking
programowanie dynamiczne algorytmy zachłanne
backtracking jest zazwyczaj najwolniejszy, ale ma najszersze zastosowania
programowanie dynamiczne jest zazwyczaj szybsze, ale skonstruowanie rozwi ˛azania opartego o t ˛a technik˛e mo˙ze by´c trudniejsze lub czasami niemo˙zliwe
algorytmy zachłanne s ˛a zazwyczaj najszybsze, ale
Rekurencja Liczby Fibonacciego NWD Wie˙ze Hanoi szachownica Backtracking
omówili´smy ju˙z 3 wa˙zne techniki programowania:
backtracking
programowanie dynamiczne algorytmy zachłanne
backtracking jest zazwyczaj najwolniejszy, ale ma najszersze zastosowania
programowanie dynamiczne jest zazwyczaj szybsze, ale skonstruowanie rozwi ˛azania opartego o t ˛a technik˛e mo˙ze by´c trudniejsze lub czasami niemo˙zliwe
algorytmy zachłanne s ˛a zazwyczaj najszybsze, ale
Rekurencja Liczby Fibonacciego NWD Wie˙ze Hanoi szachownica Backtracking
omówili´smy ju˙z 3 wa˙zne techniki programowania:
backtracking
programowanie dynamiczne
algorytmy zachłanne
backtracking jest zazwyczaj najwolniejszy, ale ma najszersze zastosowania
programowanie dynamiczne jest zazwyczaj szybsze, ale skonstruowanie rozwi ˛azania opartego o t ˛a technik˛e mo˙ze by´c trudniejsze lub czasami niemo˙zliwe
algorytmy zachłanne s ˛a zazwyczaj najszybsze, ale
Rekurencja Liczby Fibonacciego NWD Wie˙ze Hanoi szachownica Backtracking
omówili´smy ju˙z 3 wa˙zne techniki programowania:
backtracking
programowanie dynamiczne algorytmy zachłanne
backtracking jest zazwyczaj najwolniejszy, ale ma najszersze zastosowania
programowanie dynamiczne jest zazwyczaj szybsze, ale skonstruowanie rozwi ˛azania opartego o t ˛a technik˛e mo˙ze by´c trudniejsze lub czasami niemo˙zliwe
algorytmy zachłanne s ˛a zazwyczaj najszybsze, ale
Rekurencja Liczby Fibonacciego NWD Wie˙ze Hanoi szachownica Backtracking
omówili´smy ju˙z 3 wa˙zne techniki programowania:
backtracking
programowanie dynamiczne algorytmy zachłanne
backtracking jest zazwyczaj najwolniejszy, ale ma najszersze zastosowania
programowanie dynamiczne jest zazwyczaj szybsze, ale skonstruowanie rozwi ˛azania opartego o t ˛a technik˛e mo˙ze by´c trudniejsze lub czasami niemo˙zliwe
algorytmy zachłanne s ˛a zazwyczaj najszybsze, ale
Rekurencja Liczby Fibonacciego NWD Wie˙ze Hanoi szachownica Backtracking
omówili´smy ju˙z 3 wa˙zne techniki programowania:
backtracking
programowanie dynamiczne algorytmy zachłanne
backtracking jest zazwyczaj najwolniejszy, ale ma najszersze zastosowania
programowanie dynamiczne jest zazwyczaj szybsze, ale skonstruowanie rozwi ˛azania opartego o t ˛a technik˛e mo˙ze by´c trudniejsze lub czasami niemo˙zliwe
algorytmy zachłanne s ˛a zazwyczaj najszybsze, ale
Rekurencja Liczby Fibonacciego NWD Wie˙ze Hanoi szachownica Backtracking
omówili´smy ju˙z 3 wa˙zne techniki programowania:
backtracking
programowanie dynamiczne algorytmy zachłanne
backtracking jest zazwyczaj najwolniejszy, ale ma najszersze zastosowania
programowanie dynamiczne jest zazwyczaj szybsze, ale skonstruowanie rozwi ˛azania opartego o t ˛a technik˛e mo˙ze by´c trudniejsze lub czasami niemo˙zliwe
algorytmy zachłanne s ˛a zazwyczaj najszybsze, ale maj ˛a najbardziej ograniczone zastosowanie
Rekurencja Liczby Fibonacciego NWD Wie˙ze Hanoi szachownica Backtracking
Zwró´c uwag ˛e na brak mo˙zliwo´sci zastosowania algorytmu brutalnego z powodu olbrzymiej ilo´sci potencjalnych rozwi ˛aza ´n.
Rozwi ˛azanie
konfiguracje mo˙zemy trzyma´c jako dwuwymiarow ˛a tablic ˛e 9x9 zawieraj ˛ac ˛a liczby w kolejnych komórkach w kolejnych krokach b ˛edziemy dopisywa´c liczby w kolejnych wolnych polach wierszami od góry (a w obr ˛ebie wiersza od lewej)
przed wpisaniem liczby w puste pole, b ˛edziemy wyznaczali liczby, które mo˙zemy tam wpisa´c
Rekurencja Liczby Fibonacciego NWD Wie˙ze Hanoi szachownica Backtracking
Zwró´c uwag ˛e na brak mo˙zliwo´sci zastosowania algorytmu brutalnego z powodu olbrzymiej ilo´sci potencjalnych rozwi ˛aza ´n.
Rozwi ˛azanie
konfiguracje mo˙zemy trzyma´c jako dwuwymiarow ˛a tablic ˛e 9x9 zawieraj ˛ac ˛a liczby w kolejnych komórkach
w kolejnych krokach b ˛edziemy dopisywa´c liczby w kolejnych wolnych polach wierszami od góry (a w obr ˛ebie wiersza od lewej)
przed wpisaniem liczby w puste pole, b ˛edziemy wyznaczali liczby, które mo˙zemy tam wpisa´c
Rekurencja Liczby Fibonacciego NWD Wie˙ze Hanoi szachownica Backtracking
Zwró´c uwag ˛e na brak mo˙zliwo´sci zastosowania algorytmu brutalnego z powodu olbrzymiej ilo´sci potencjalnych rozwi ˛aza ´n.
Rozwi ˛azanie
konfiguracje mo˙zemy trzyma´c jako dwuwymiarow ˛a tablic ˛e 9x9 zawieraj ˛ac ˛a liczby w kolejnych komórkach w kolejnych krokach b ˛edziemy dopisywa´c liczby w kolejnych wolnych polach wierszami od góry (a w obr ˛ebie wiersza od lewej)
przed wpisaniem liczby w puste pole, b ˛edziemy wyznaczali liczby, które mo˙zemy tam wpisa´c
Rekurencja Liczby Fibonacciego NWD Wie˙ze Hanoi szachownica Backtracking
Zwró´c uwag ˛e na brak mo˙zliwo´sci zastosowania algorytmu brutalnego z powodu olbrzymiej ilo´sci potencjalnych rozwi ˛aza ´n.
Rozwi ˛azanie
konfiguracje mo˙zemy trzyma´c jako dwuwymiarow ˛a tablic ˛e 9x9 zawieraj ˛ac ˛a liczby w kolejnych komórkach w kolejnych krokach b ˛edziemy dopisywa´c liczby w kolejnych wolnych polach wierszami od góry (a w obr ˛ebie wiersza od lewej)
przed wpisaniem liczby w puste pole, b ˛edziemy wyznaczali liczby, które mo˙zemy tam wpisa´c