Informatyka w roku szkolnym 2008/09 w semestrze zimowym w klasie matematycznej 1A
Celem tych zajęć jest nauczenie Was wykorzystania komputera do efektywnego rozwiązywania zadań obliczeniowych. Na lekcjach będą omawiane zarówno metody rozwiązywania zadań (algorytmika) jak i narzędzia (język C++ i biblioteka STL dla C++).
Informacje organizacyjne
Terminarz:
- termin: środa 7:30-9:00 s.214
- nauczyciel: Paweł Rzechonek
Pomoce dydaktyczne:
- wstęp do programowania - notatki K.Lorysia uzupełnione przez R.Nowaka (IntroC.doc)
- C++ Reference
- C Standard Library
- Marshall Brain: How C Programming Works
- Steven Holmes: C Programming
- C/C++ Directory in The Object Oriented Programming Web
Zasady oceniania
Zasady zaliczenia przedmiotu opierają się na systemie punktowym. Punkty można uzyskiwać za:
- sprawdziany
- aktywność na zajęciach
- rozwiązywanie zadań domowych
- udział w zawodach programistycznych
Notatki z lekcji
Spis tematów:
- klasy
- pliki
- grafy
- kolekcja vector z STL
- grafy skierowane
- ścieżki i cykle
- drzewa rozpinające
- kolejki priorytetowe
- grafy ważone
- przejście przez szachownicę / pełny przegląd zbioru rozwiązań
- kolorowanie grafów / algorytmy z powrotami
- problem komiwojażera / metoda podziału i ograniczeń
- problem plecakowy / metoda podziału i ograniczeń
- dziel i zwyciężaj
- programowanie dynamiczne (1)
- programowanie dynamiczne (2)
- wyszukiwanie wzorca w tekście
- automaty skończone
- zastosowanie automatów do wyszukiwania wzorców
4.02.2009: klasy
- Zagadnienia omawiane na lekcji
-
- Operatory new (przydział pamięci) i delete (zwolnienie pamięci).
- Pojęcie klasy (nowy typ) i obiektu (instancja klasy w pamięci).
- Definicja klasy i składowych w klasie.
- Definicja metod poza klasą.
- Konstruktory i destruktor.
- Dynamiczne struktury danych - lista jednokierunkowa.
- Zadanie
-
Zdefiniuj listę jednokierunkową z operacjami dodawania i usuwania elementów na jej początku i końcu.
11.02.2009: pliki
- Zagadnienia omawiane na lekcji
-
- Pojęcie strumienia.
- Plik jako strumień danych.
- Otwieranie i zamykanie pliku..
- Czytanie z pliku danych tekstowych.
- Zapis do pliku danych tekstowych.
- Sprawdzanie stanu pliku.
- Zadanie
-
Z pliku a.txt odczytaj liczby i zapisz je w odwrotnej kolejności do pliku b.txt. Wykorzystaj do tego celu listę jednokierunkową zaprogramowaną na poprzedniej lekcji.
18.02.2009: grafy
- Sprawdzian
-
Odczytaj wszystkie liczby całkowite zapisane w pliku a.txt i do pliku b.txt zapisz ich kwadraty.
Wskazówka! Do czytania z pliku wykorzystaj obiekt ifstream a do pisania ofstream.
- Zagadnienia omawiane na lekcji
-
- Pojęcie grafu.
- Macierzowa reprezentacja grafu.
- Listowa reprezentacja grafu.
- Złożoność podstawowych operacji na grafach w zależności od reprezentacji.
- Przeglądanie grafu w głąb.
- Problem istnienia ścieżki łączącej dwa wierzchołki w grafie.
25.02.2009: kolekcja vector z STL
- Sprawdzian
-
Wczytaj liczbę k∈{1,2,...20} i wypisz najmniejszą liczbę naturalną podzielną przez liczby 1,2,...k. Na przykład liczba 2520 jest najmniejszą liczba podzielną przez 1,2,...10.
Wskazówka! Rozważ wszystkie liczby z przedziału {1,2,...20}, które są potęgami jakiejś liczby pierwszej.
- Zagadnienia omawiane na lekcji
-
- Klasa sparametryzowana vector.
- Reprezentacja grafu z wykorzystaniem wektorów.
- Przeglądanie grafu wszerz.
- Problem najkrótszej ścieżki łączącej dwa wierzchołki w grafie.
4.03.2009: grafy skierowane
- Sprawdzian
-
W pliku tekstowym graf.txt zapisany jest graf G=(V,E) oraz wierzchołek startowy s. Wypisz na standardowym wyjściu najbardziej odległy wierzchołek (w sensie najkrótszych ścieżek) od wierzchołka s.
Wskazówka! Zastosuj przeglądanie grafu wszerz.
- Zagadnienia omawiane na lekcji
-
- Powtórzenie materiału dotyczącego grafów.
- Grafy skierowane.
11.03.2009: ścieżki i cykle
- Sprawdzian
-
W pliku tekstowym graf.txt zapisany jest graf skierowany D=(V,E), wierzchołek startowy s i liczba naturalna k. Wylicz i wypisz na standardowym wyjściu ile ten graf zawiera wierzchołków odległych od wierzchołka s o co najwyżej k krawędzi.
Wskazówka! Zastosuj przeglądanie grafu w głąb z ograniczeniem rekurencji.
- Zagadnienia omawiane na lekcji
-
- Ścieżki w grafie (ścieżki proste).
- Cyke w grafie (cykle proste).
- Cykl Eulera.
- Cykl Hamiltona.
18.03.2009: drzewa rozpinające
- Sprawdzian
-
W pliku tekstowym graf.txt zapisany jest graf G=(V,E). Wyznacz dla tego grafu drzewo rozpinające.
Wskazówka! Zastosuj zmodyfikowaną procedurę przeglądania grafu w głąb.
- Zagadnienia omawiane na lekcji
-
- Grafy, które są drzewami.
- Drzewo rozpinające w grafie.
25.03.2009: kolejki priorytetowe
- Zagadnienia omawiane na lekcji
-
- Kolejka priorytetowa.
- Realizacja kolejki w STL jako priority_queue<>.
- Projekt
-
Dane są dwie 4-cyfrowe (w zapisie dziesiętnym) liczby pierwsze p i q. Należy znaleźć najkrótszy ciąg liczb, zaczynający się od p i kończący się na q, który składa sie z 4-cyfrowych liczb pierwszych i każde dwie sąsiednie liczby w tym ciągu różnią się tylko jedną cyfrą.
Przykład. Dla liczb p=2011 i q=4409, najkrótszy ciąg liczbowy, który łączy te liczby to (2011, 3011, 3019, 1019, 1009, 1409, 4409).
Wskazówka! Stwórz graf połączeń pomiędzy 4-cyfrowymi liczbami pierwszymi różniącymi się tylko jedną cyfrą. Zastosuj zmodyfikowaną procedurę przeglądania tego grafu wszerz.
1.04.2009: grafy ważone
- Zagadnienia omawiane na lekcji
-
- Grafy ważone (z wagami na krawędziach).
- Najkrótsza droga w grafie ważonym (algorytm Dijkstry).
- Para wartości pair<>.
- Projekt
-
Dany jest graf ważony G=(V,E,w), gdzie w to wagi krawędzi (dodatnie liczby całkowite), oraz wierzchołek startowy s i końcowy f. Napisz program, który znajduje długość najkrótszej ścieżki z s do f.
Wskazówka! Zaimplementuj algorytm Dijkstry z relaksacją.
8.04.2009: przejście przez szachownicę / pełny przegląd zbioru rozwiązań
- Zadanie
-
Dana jest szachownica o wymiarach w×k, gdzie w,k∈{4,...,10}. Należy obejść skoczkiem całą szachownicę odwiedzając każde pole dokładnie raz. Wypisz w⋅k współrzędnych kolejno odwiedzanych przez skoczka pól na szachownicy, albo parę liczb -1 -1 gdy zadanie nie ma rozwiązania.
Wskazówka! Znajdź ścieżkę Hamiltona w grafie połączeń między polami na szachownicy.
- Zagadnienia omawiane na lekcji
-
- Problem skoczka na szachownicy.
- Algorytmy naiwne - badają wszystkie możliwe rozwiązania aż do znalezienia rozwiązania optymalnego.
- Kolorowanie grafów.
15.04.2009: kolorowanie grafów / algorytmy z powrotami
- Zagadnienia omawiane na lekcji
-
- Kolorowanie grafów.
- Algorytmy z powotami.
- Projekt
-
Dany jest graf G=(V,E). Napisz program, który znajdzie minimalne pokolorowanie wierzchołków tego grafu.
Wskazówka! Zmodyfikuj przeszukiwanie grafu w głąb i zastosuj metodę z nawrotami.
22.04.2009: problem komiwojażera / metoda podziału i ograniczeń
- Zagadnienia omawiane na lekcji
-
- Problem komiwojażera.
- Metoda podziału i ograniczeń.
- Definiowanie własnych operatorów porównujących.
- Projekt
-
Dany jest graf pełny ważony G=(V,E,w), gdzie w to wagi krawędzi (dodatnie liczby całkowite). Napisz program, który znajduje długość najkrótszej drogi komiwojażera (cykl Hamiltona o najmniejszej wadze) w tym grafie.
Wskazówka! Zastosuj metodę podziału i ograniczeń.
29.04.2009: problem plecakowy / metoda podziału i ograniczeń
- Zagadnienia omawiane na lekcji
-
- Problem plecakowy.
- Metoda podziału i ograniczeń.
- Projekt
-
Dany jest plecak o wytrzymałości W<0 oraz zbiór n przedmiotów x0, x1, ...,xn-1, przy czym dla każdego przedmiotu jest określona jego waga wi i wartość pi dla i=0...n-1. Napisz program, który wyznaczy taki podzbiór tych przedmiotów, aby ich sumaryczna wartość była maksymalna przy sumarycznej wadze nieprzekraczającej wytrzymałości plecaka.
Wskazówka! Zastosuj metodę podziału i ograniczeń.
6.05.2009: dziel i zwyciężaj
- Zagadnienia omawiane na lekcji
-
- Omówienie techniki "dziel i zwyciężaj".
- Wyszukiwanie binarne.
- Sortowanie przez scalanie.
- Sortowanie przez wybór (szybkie).
- Mnożenie długich liczb.
- Maksymalny podciąg spójny.
- Zadanie
-
Dany jest ciąg n>1 liczb całkowitych x0, x1, ..., xn-1. Znajdź w tym ciągu taki podciąg spójny xi, xi+1, ..., xj (dla 0≤i≤j<n), w którym suma jego elementów jest maksymalna.
13.05.2009: programowanie dynamiczne (1)
- Zagadnienia omawiane na lekcji
-
- Omówienie techniki programowania dynamicznego.
- Liczby Fibonacciego.
- Dwumian Newtona.
- Stokrotki.
- Najdłuższy wspólny podciąg.
- Triangulacja wielokątawypukłego.
- Zadanie
-
Dany jest zbiór n>3 punktów p0, p1, ..., pn-1, tworzących na płaszczyźnie wielokąt wypukły. Podziel ten wielokąt na trójkąty w taki sposób, aby suma długości przekątnych (tych które dzielą wielokąt na trójkąty) była minimalna.
20.05.2009: programowanie dynamiczne (2)
- Sprawdzian
-
Dane są dwa ciągi A = (a1,a2,...,am) i B = (b1,b2,...,bn) o długościach odpowiednio m i n. Znajdź długość najdłuższego wspólnego podciągu dla A i B oraz wypisz jeden z nich.
- Zagadnienia omawiane na lekcji
-
- Najdłuższy wspólny podciąg.
- Najdłuższy podciąg rosnący.
- Zadanie
-
Dany jest ciąg n>1 liczb całkowitych a0, a1, ..., an-1. Znajdź w tym ciągu najdłuższy podciąg rosnący.
27.05.2009: wyszukiwanie wzorca w tekście
- Zagadnienia omawiane na lekcji
-
- Problem wyszukiwania wzorca w tekście.
- Algorytm naiwny wyszukiwania wzorca i jego analiza.
- Algorytm Karpa-Rabina wyszukiwania wzorca.
- Zadanie
-
Zaimplementuj algorytm Karpa-Rabina.
3.06.2009: automaty skończone
- Zagadnienia omawiane na lekcji
-
- Pojęcie automatu skończonego.
- Przykłady automatów skończonych.
- Implementacja automatów skończonych.
- Strumienie napisowe.
- Zadanie
-
Zaimplementuj automat skończony, który będzie rozpoznawał prawidłowo zapisane (jak w języku C++) liczby rzeczywiste.
10.06.2009: zastosowanie automatów do wyszukiwania wzorców
- Zagadnienia omawiane na lekcji
-
- Prefiksy i sufiksy.
- Algorytm wyszukiwania wzorca korzystający z automatu skończonego.
- Algorytm Knutha-Morrisa-Pratta wyszukiwania wzorca.
- Zadanie
-
Zaimplementuj algorytm Knutha-Morrisa-Pratta.
Zadania domowe
Spis zadań domowych:
- podział pliku względem 0
- ścieżka w grafie
- najkrótsza ścieżka w grafie
- drogi powrotne w grafie skierowanym
- cykl Eulera w grafie
- cykl Hamiltona w grafie gęstym
- ciągi liczb pierwszych (projekt)
- najkrótsza ścieżka w grafie ważonym (projekt)
- kolorowanie grafu (projekt)
- problem komiwojażera (projekt)
- problem plecakowy (projekt)
- maksymalny podciąg spójny
- minimalna triangulacja wielokąta wypukłego
- najdłuższy podciąg rosnący
Zadanie 1
- Zadanie (podział pliku względem 0)
- W pliku tekstowym zapisanych jest n>0 liczb całkowitych a0, a1, ..., an-1 (początkowo nie wiemy jaką wartość ma n). Liczby z tego pliku należy podzielić na dwie grupy: mniejsze od 0 oraz większe bądź równe 0. Zapisz je w tym samym pliku, z którego przeczytałeś dane w taki sposób, żeby liczby mniejsze od 0 były zapisane przed liczbami większymi bądź równymi 0. Nie zmieniaj względnej kolejności liczb w obu grupach w stosunku do kolejności pierwotnej.
- Wskazówki
-
- Zakładamy, że nazwa pliku z liczbami to liczby.txt.
- Wykorzystaj listy, które były omawiane na lekcji.
- Rozwiązanie
-
Rozwiązanie zadania należy przesłać do mnie mailem.
W treści listu należy powinny się znaleźć następujące informacje:
- imię i nazwisko;
- program w języku C++, który dokonuje opisanego przekształcenia danych w pliku.
- Punkty
- Za rozwiązanie tego zadania można otrzymać do 5 punktów.
- Termin
- Termin nadsyłania rozwiązań upływa w poniedziałek 16 lutego 2009 r. o godzinie 23:59.
Zadanie 2
- Zadanie (ścieżka w grafie)
- W pliku tekstowym graf.txt zapisany jest graf G=(V,E) oraz dwa wybrane wierzchołki u i v. Sprwadź, czy w tym grafie istnieje ścieżka łącząca te wierzchołki.
- Dane
- Dane zapisane w pliku mają następujący format. Najpierw zapisane są dwie liczby: n = |V| i m = |E|, przy czym n≤1000. Następnie zapisanych jest m krawędzi w postaci par liczb (każda para oznacza wierzchołki połączone krawędzią w grafie). Na końcu zapisane są numery dwóch wierzchołków, o które pytamy w zadaniu, czy są połącznone jakąś ścieżką.
- Wyniki
- Rozwiązanie należy wypisać na standardowym wyjściu. Jeśli istnieje ścieżka łącząca wierzchołki u i v to wypisz 1 (albo słowo TAK), a w przeciwnym przypadku wypisz 0 (albo słowo NIE).
- Wskazówki
-
- Wykorzystaj macierzową reprezentację grafu.
- Napisz osobną funkcję przeglądającą graf w głąb.
- Rozwiązanie
-
Rozwiązanie zadania należy przesłać do mnie mailem.
W treści listu należy powinny się znaleźć następujące informacje:
- imię i nazwisko;
- program w języku C++, który rozwiązuje opisane zadanie.
- Punkty
- Za rozwiązanie tego zadania można otrzymać do 7 punktów.
- Termin
- Termin nadsyłania rozwiązań upływa w poniedziałek 23 lutego 2009 r. o godzinie 23:59.
Zadanie 3
- Zadanie (najkrótsza ścieżka w grafie)
- W pliku tekstowym graf.txt zapisany jest graf G=(V,E) oraz dwa wybrane wierzchołki u i v. Oblicz, jaka jest długość najkrótszej ścieżki w grafie łączącej te wierzchołki. W wersji rozszerzonej tego zadania dodatkowo wypisz tą ścieżkę, zaczynając od wierzchołka u i kończąc na v.
- Dane
- Dane zapisane w pliku mają następujący format. Najpierw zapisane są dwie liczby: n = |V| i m = |E|, przy czym n≤1000. Następnie zapisanych jest m krawędzi w postaci par liczb (każda para oznacza wierzchołki połączone krawędzią w grafie). Na końcu zapisane są numery dwóch wierzchołków, o które pytamy w zadaniu, jak długą ścieżką są połącznone.
- Wyniki
- Rozwiązanie należy wypisać na standardowym wyjściu. Jeśli istnieje ścieżka łącząca wierzchołki u i v to wypisz długość tej ścieżki, a w przeciwnym przypadku wypisz -1. W wersji rozszerzonej tego zadania dodatkowo wypisz tą ścieżkę, jeśli taka istnieje.
- Wskazówki
-
- Wykorzystaj listową reprezentację grafu wykorzystując klasę vector.
- Napisz osobną funkcję przeglądającą graf wszerz.
- Rozwiązanie
-
Rozwiązanie zadania należy przesłać do mnie mailem.
W treści listu należy powinny się znaleźć następujące informacje:
- imię i nazwisko;
- program w języku C++, który rozwiązuje opisane zadanie.
- Punkty
- Za rozwiązanie tego zadania można otrzymać do 7 punktów, a w wersji rozszerzonej do 11 punktów.
- Termin
- Termin nadsyłania rozwiązań upływa w poniedziałek 2 marca 2009 r. o godzinie 23:59.
Zadanie 4
- Zadanie (drogi powrotne w grafie skierowanym)
- W pliku tekstowym graf.txt zapisany jest graf skierowany D=(V,E) oraz wierzchołek startowy s. Wyznacz wszystkie wierzchołki w tym grafie, do których można dojść z wierzchołka startowego i z których istnieje droga powrotna do s.
- Dane
- Dane zapisane w pliku mają następujący format. Najpierw zapisane są dwie liczby: n = |V| i m = |E|, przy czym n≤1000. Następnie zapisanych jest m krawędzi w postaci par liczb (każda para oznacza wierzchołki połączone krawędzią w grafie). Na końcu zapisany jest numer wierzchołka startowego s.
- Wyniki
- Rozwiązanie należy wypisać na standardowym wyjściu. Wypisz wszystkie wierzchołki v, dla których istnieje ścieżka z s do v i ścieżka z v do s. Wierzchołki należy wypisać w sposób uporządkowany (od najmniejszego do największego) razem z wierchołkiem s.
- Wskazówki
-
- Wykorzystaj listową reprezentację grafu wykorzystując klasę vector.
- Napisz osobną funkcję przeglądającą graf w głąb.
- Rozwiązanie
-
Rozwiązanie zadania należy przesłać do mnie mailem.
W treści listu należy powinny się znaleźć następujące informacje:
- imię i nazwisko;
- program w języku C++, który rozwiązuje opisane zadanie.
- Punkty
- Za rozwiązanie tego zadania można otrzymać do 7 punktów.
- Termin
- Termin nadsyłania rozwiązań upływa w poniedziałek 9 marca 2009 r. o godzinie 23:59.
Zadanie 5
- Zadanie (cykl Eulera w grafie)
- W pliku tekstowym graf.txt zapisany jest graf G=(V,E). Sprawdź, czy w tym grafie istnieje cykl Eulera. W wersji rozszerzonej tego zadania dodatkowo wypisz ten cykl.
- Dane
- Dane zapisane w pliku mają następujący format. Najpierw zapisane są dwie liczby: n = |V| i m = |E|, przy czym n≤1000. Następnie zapisanych jest m krawędzi w postaci par liczb (każda para oznacza wierzchołki połączone krawędzią w grafie).
- Wyniki
- Rozwiązanie należy wypisać na standardowym wyjściu. Jeśli istnieje cykl Eulera w zadanym grafie to wypisz długość tego cyklu (czyli wartość m), a w przeciwnym przypadku wypisz -1. W wersji rozszerzonej tego zadania dodatkowo wypisz cykl Eulera, jeśli taki istnieje (zacznij od wierzchołka 0 i skończ na tym wierzchołku).
- Wskazówki
-
- Wykorzystaj listową reprezentację grafu wykorzystując klasę vector.
- Napisz osobną funkcję szukającą cyklu w grafie.
- Rozwiązanie
-
Rozwiązanie zadania należy przesłać do mnie mailem.
W treści listu należy powinny się znaleźć następujące informacje:
- imię i nazwisko;
- program w języku C++, który rozwiązuje opisane zadanie.
- Punkty
- Za rozwiązanie tego zadania można otrzymać do 5 punktów, a w wersji rozszerzonej do 11 punktów.
- Termin
- Termin nadsyłania rozwiązań upływa w poniedziałek 16 marca 2009 r. o godzinie 23:59.
Zadanie 6
- Zadanie (cykl Hamiltona w grafie gęstym)
- W pliku tekstowym graf.txt zapisany jest graf G=(V,E). W grafie tym stopień każdego wierzchołka jest ≥n/2, przy czym n=|V|. Wymyśl i zaprogramuj algorytm wyznaczający dla takiego grafu cykl Hamiltona.
- Dane
- Dane zapisane w pliku mają następujący format. Najpierw zapisane są dwie liczby: n = |V| i m = |E|, przy czym n≤1000. Następnie zapisanych jest m krawędzi w postaci par liczb (każda para oznacza wierzchołki połączone krawędzią w grafie).
- Wyniki
- Rozwiązanie należy wypisać na standardowym wyjściu. Cykl Hamiltona wypisz zaczynając od wierzchołka 0 i kończąc na tym wierzchołku.
- Wskazówka
-
- Wykorzystaj tablicową reprezentację grafu wykorzystując klasę vector.
- Rozwiązanie
-
Rozwiązanie zadania należy przesłać do mnie mailem.
W treści listu należy powinny się znaleźć następujące informacje:
- imię i nazwisko;
- program w języku C++, który rozwiązuje opisane zadanie.
- Punkty
- Za rozwiązanie tego zadania można otrzymać do 11 punktów.
- Termin
- Termin nadsyłania rozwiązań upływa w poniedziałek 23 marca 2009 r. o godzinie 23:59.
Zadanie 7
- Zadanie (ciągi liczb pierwszych)
- Dane są dwie 4-cyfrowe (w zapisie dziesiętnym) liczby pierwsze p i q. Należy znaleźć najkrótszy ciąg liczb, zaczynający się od p i kończący się na q, który składa sie z 4-cyfrowych liczb pierwszych i każde dwie sąsiednie liczby w tym ciągu różnią się tylko jedną cyfrą.
- Dane
- Dane to dwie liczby pierwsze zapisane p i q, takie że 1000<p,q<9999.
- Wyniki
- Rozwiązanie należy wypisać na standardowym wyjściu. Ma to być ciąg 4-cyfrowych (w zapisie dziesiętnym) liczb pierwszych, zaczynający się od p i kończący się na q, takich że każde dwie sąsiednie liczby w tym ciągu różnią się tylko jedną cyfrą.
- Przykład
-
Dla liczb p=2011 i q=4409 najkrótszy ciąg 4-cyfrowych
liczb pierwszych, który łączy te liczby według wyżej opisanej reguły to:
2011 3011 3019 1019 1009 1409 4409 - Wskazówki
-
- Wykorzystaj listową reprezentację grafu wykorzystując klasę vector.
- Stwórz graf połączeń pomiędzy 4-cyfrowymi liczbami pierwszymi różniącymi się tylko jedną cyfrą.
- Zastosuj zmodyfikowaną procedurę przeglądania tego grafu wszerz.
- Rozwiązanie
-
Rozwiązanie zadania należy przesłać do mnie mailem.
W treści listu należy powinny się znaleźć następujące informacje:
- imię i nazwisko;
- program w języku C++, który rozwiązuje opisane zadanie.
- Punkty
- Za rozwiązanie tego zadania można otrzymać do 7 punktów.
- Termin
- Termin nadsyłania rozwiązań upływa w poniedziałek 30 marca 2009 r. o godzinie 23:59.
Zadanie 8
- Zadanie (najkrótsza ścieżka w grafie ważonym)
- Dany jest graf zażony G=(V,E,w), gdzie w to wagi krawędzi (dodatnie liczby całkowite), oraz wierzchołek startowy s i końcowy f. Zaprogramuj algorytm Dijkstry znajdujący długość najkrótszej ścieżki z s do f. W wersji rozszerzonej tego zadania dodatkowo wypisz tą ścieżkę, zaczynając od wierzchołka s i kończąc na f.
- Dane
- Dane zapisane są w pliku tekstowym graf.txt i mają następujący format. Najpierw zapisane są dwie liczby: n = |V| i m = |E|, przy czym n≤1000. Następnie zapisanych jest m krawędzi w postaci trójek liczb (każda trójka oznacza parę wierzchołków połączonych krawędzią w grafie i wagę przypisaną tej krawędzi). Na końcu umieszczone są jeszcze numery dwóch wierzchołków: początkowego s i końcowego f.
- Wyniki
- Rozwiązanie należy wypisać na standardowym wyjściu. Ma to być długość najkrótszej ścieżki łączącej s i f. W wersji rozszerzonej tego zadania dodatkowo wypisz tą ścieżkę.
- Rozwiązanie
-
Rozwiązanie zadania należy przesłać do mnie mailem.
W treści listu należy powinny się znaleźć następujące informacje:
- imię i nazwisko;
- program w języku C++, który rozwiązuje opisane zadanie.
- Punkty
- Za rozwiązanie tego zadania można otrzymać do 7 punktów, a w wersji rozszerzonej do 11 punktów.
- Termin
- Termin nadsyłania rozwiązań upływa w poniedziałek 6 kwietnia 2009 r. o godzinie 23:59.
Zadanie 9
- Zadanie (kolorowanie grafu)
- Dany jest graf G=(V,E). Napisz program, który znajdzie minimalne pokolorowanie wierzchołków tego grafu.
- Dane
- Dane zapisane są w pliku tekstowym graf.txt i mają następujący format. Najpierw zapisane są dwie liczby: n = |V| i m = |E|, przy czym n≤1000. Następnie zapisanych jest m krawędzi w postaci par liczb (każda para oznacza wierzchołki połączone krawędzią w grafie).
- Wyniki
- Rozwiązanie należy wypisać na standardowym wyjściu. W pierwszej linii wypisz liczbę użytych kolorów. W następnych n liniach wypisz kolory przypisane kolejnym wierzchołkom - jeśli użyłeś k kolorow, to wierzchołki mają mieć kolory z zakresu 0...k-1.
- Wskazówki
-
- Wykorzystaj listową reprezentację grafu.
- Zastosuj metodę z nawrotami.
- Rozwiązanie
-
Rozwiązanie zadania należy przesłać do mnie mailem.
W treści listu należy powinny się znaleźć następujące informacje:
- imię i nazwisko;
- program w języku C++, który rozwiązuje opisane zadanie.
- Punkty
- Za rozwiązanie tego zadania można otrzymać do 7 punktów.
- Termin
- Termin nadsyłania rozwiązań upływa w poniedziałek 20 kwietnia 2009 r. o godzinie 23:59.
Zadanie 10
- Zadanie (problem komiwojażera)
- Dany jest graf pełny ważony G=(V,E,w) z dodatnimi wagami na krawędziach. Napisz program, który znajdzie trasę komiwojażera w tym grafie (cykl Hamiltona) o minimalnej wadze.
- Dane
- Dane zapisane są w pliku tekstowym graf.txt i mają następujący format. Najpierw zapisana jest liczba n = |V|, przy czym n≤100. Następnie zapisanych jest n wierszy z n wagami na krawędziach (ważona macierz sąsiedztwa), przy czym wszystkie wagi są liczbami naturalnymi <1000 a na głównej przekątnej są zera.
- Wyniki
- Rozwiązanie należy wypisać na standardowym wyjściu. W pierwszej linii wypisz koszt minimalnej trasy komiwojażera. W drugiej linii wypisz n kolejno odwiedzanych przez komiwojażera wierzchołków na jego minimalnej trasie (numery wierzchołków pooddzielaj spacjami) zaczynając od wierzchołka o numerze 0.
- Wskazówki
-
- Wykorzystaj macierzową reprezentację grafu.
- Zastosuj metodę podziału i ograniczeń.
- Rozwiązanie
-
Rozwiązanie zadania należy przesłać do mnie mailem.
W treści listu należy powinny się znaleźć następujące informacje:
- imię i nazwisko;
- program w języku C++, który rozwiązuje opisane zadanie.
- Punkty
- Za rozwiązanie tego zadania można otrzymać do 13 punktów.
- Termin
- Termin nadsyłania rozwiązań upływa w poniedziałek 27 kwietnia 2009 r. o godzinie 23:59.
Zadanie 11
- Zadanie (problem plecakowy)
- Dany jest plecak o wytrzymałości W<0 oraz zbiór n przedmiotów x0, x1, ...,xn-1, przy czym dla każdego przedmiotu jest określona jego waga wi i wartość pi dla i=0...n-1. Napisz program, który wyznaczy taki podzbiór tych przedmiotów, aby ich sumaryczna wartość była maksymalna przy sumarycznej wadze nieprzekraczającej wytrzymałości plecaka.
- Dane
- Dane zapisane są w pliku tekstowym przedmioty.txt i mają następujący format. Najpierw zapisana jest wytrzymałość plecaka W>0. W kolejnej linii zapisana jest liczba przedmiotów n≤1000. Następnie zapisanych jest n wierszy opisujących parametry kolejnych przedmiotów - w każdym wierszu zapisana jest para liczb, gdzie pierwsza liczba jest wartością a druga wagą przedmiotu.
- Wyniki
- Rozwiązanie należy wypisać na standardowym wyjściu. W pierwszej linii wypisz maksymalną wartość zapakowanego plecaka, w drugiej linii wypisz ciężar optymalnego upakowania a w trzeciej wypisz kolejno numery zapakowanych do plecaka przedmiotów (numery przedmiotów pooddzielaj spacjami).
- Wskazówka
-
- Zastosuj metodę podziału i ograniczeń.
- Rozwiązanie
-
Rozwiązanie zadania należy przesłać do mnie mailem.
W treści listu należy powinny się znaleźć następujące informacje:
- imię i nazwisko;
- program w języku C++, który rozwiązuje opisane zadanie.
- Punkty
- Za rozwiązanie tego zadania można otrzymać do 13 punktów.
- Termin
- Termin nadsyłania rozwiązań upływa w poniedziałek 4 maja 2009 r. o godzinie 23:59.
Zadanie 12
- Zadanie (maksymalny podciąg spójny)
- Dany jest ciąg n>1 liczb całkowitych x0, x1, ..., xn-1. Napisz program, który znajdzie w tym ciągu taki podciąg spójny xi, xi+1, ..., xj (dla 0≤i≤j<n), w którym suma jego elementów jest maksymalna.
- Dane
- Dane do programu należy odczytać ze standardowego wejścia. Mają one następujący format. W pierwszej linii podana będzie długość ciągu n, przy czym 1<n≤1000. W drugiej linii podanych będzie n liczb całkowitych pooddzielanych od siebie spacjami.
- Wyniki
- Rozwiązanie należy wypisać na standardowym wyjściu. W pierwszej linii wypisz maksymalną wartość znalezionego poddciągu, a w drugiej i trzeciej linii wypisz odpowiednio pierwszy i ostatni indeks znalezionego poddciągu.
- Wskazówka
-
- Zastosuj metodę dziel i zwyciężaj.
- Rozwiązanie
-
Rozwiązanie zadania należy przesłać do mnie mailem.
W treści listu należy powinny się znaleźć następujące informacje:
- imię i nazwisko;
- program w języku C++, który rozwiązuje opisane zadanie.
- Punkty
- Za rozwiązanie tego zadania można otrzymać do 7 punktów.
- Termin
- Termin nadsyłania rozwiązań upływa w poniedziałek 11 maja 2009 r. o godzinie 23:59.
Zadanie 13
- Zadanie (minimalna triangulacja wielokąta wypukłego)
- Dany jest zbiór n>3 punktów p0, p1, ..., pn-1, tworzących na płaszczyźnie wielokąt wypukły. Napisz program, który podzieli ten wielokąt na trójkąty w taki sposób, aby suma długości przekątnych (tych które dzielą wielokąt na trójkąty) była minimalna.
- Dane
- Dane do programu należy odczytać ze standardowego wejścia. Mają one następujący format. W pierwszej linii podana będzie liczba wierzchołków wielokąta wypukłego n, przy czym 1<n≤100. W następnych n wierszach podane będą współrzędne tych wierzchołków jako pary liczb (xi,yi), dla i=0...n-1. Punkty te będą kolejnymi wierzchołkami wielokąta, czytamymi w kierunku odwrotnym do ruchu wskazówek zegara. Każdy punkt to para liczb rzeczywistych oddzielonych od siebie spacjami.
- Wyniki
- Rozwiązanie należy wypisać na standardowym wyjściu. W pierwszej linii wypisz wartość minimalnej triangulacji podanego wielokąta a w drugiej linii wypisz numer wierzchołka, z którym połączny będzie wierzchołek 0, albo wartość -1, gdy żadna przekątna nie będzie do niego dochodzić.
- Wskazówka
-
- Zastosuj metodę programowania dynamicznego.
- Rozwiązanie
-
Rozwiązanie zadania należy przesłać do mnie mailem.
W treści listu należy powinny się znaleźć następujące informacje:
- imię i nazwisko;
- program w języku C++, który rozwiązuje opisane zadanie.
- Punkty
- Za rozwiązanie tego zadania można otrzymać do 7 punktów.
- Termin
- Termin nadsyłania rozwiązań upływa w poniedziałek 18 maja 2009 r. o godzinie 23:59.
Zadanie 14
- Zadanie (najdłuższy podciąg rosnący)
- Dany jest ciąg liczb całkowitych A = (a0, a1, ..., an-1) o długości n. Znajdź w tym ciągu długość najdłuższego podciągu rosnącego i wypisz jeden z nich.
- Dane
- Dane do programu należy odczytać ze standardowego wejścia. Mają one następujący format. W pierwszej linii podana będzie długość n ciągu A, przy czym 1≤n≤1000000. W drugiej linii zapisany będzie ciąg A. Ciąg będzie się składał z małych liter alfabetu angielskiego.
- Wyniki
- Rozwiązanie należy wypisać na standardowym wyjściu. W pierwszej linii wypisz długość najdłuższego podciągu rosnącego a w drugiej jeden z takich podciągów, który może być rozwiązaniem.
- Wskazówka
-
- Zastosuj metodę programowania dynamicznego.
- Rozwiązanie
-
Rozwiązanie zadania należy przesłać do mnie mailem.
W treści listu należy powinny się znaleźć następujące informacje:
- imię i nazwisko;
- program w języku C++, który rozwiązuje opisane zadanie.
- Punkty
- Za rozwiązanie tego zadania można otrzymać do 7 punktów.
- Termin
- Termin nadsyłania rozwiązań upływa we wtorek 26 maja 2009 r. o godzinie 23:59.
Ogłoszenia:
- 25.05.2009
- Zapomniałem wcześniej opisać zadanie, o którym rozmawialiśmy na lekcji. Zrobiłem to przed chwilą, dlatego termin jego oddania jest przedłużony do wtorku.
- 14.05.2009
- Dostałem informacje od 5 osób, że pójdą na sparing: Pawła, Agaty, Doroty, Wojtka i Miłosza. Jak ktoś jeszcze chciałby pójść na sparing, zobaczyć jak to wygląda, popróbować swoich sił w C++ i na koniec skonsumować pizzę, to proszę się kontaktować bezpośrednio z opiekunem wycieczki informatycznej lub dyrekcją.
- 13.05.2009
-
Junior Spring Challenge - sparing programistyczny w C++.
Odbędzie się 15 maja 2009 w Instytucie Informatyki
Uniwersytetu Wrocławskiego (obok Mostu Grunwaldzkiego).
Udział w zawodach wezmą gimnazjaliści z Wrocławia oraz licealiści, którzy
w bieżącym roku szkolnym rozpoczęli naukę programowania w języku C++.
Zawody będą indywidualne, oceniane częściowo. Poziom trudności dostosowany do uczestników OIG - ale wśród zadań na pewno znajdzie się także kilka trochę prostszych.
Spotykamy się w najbliższy piątek, punktualnie o godzinie 12:05, w sali nr 25 (Aula Wielka Wschodnia), w budynku Instytutu Informatyki na ulicy Joliot-Curie. Zawody skończą się po godzinie 17:00.
Ważne! Proszę wszystkie osoby z klasy IA, które chciałyby wziąć udział w sparingu, aby wysłały mi swoje zgłoszenie - sprawa jest pilna, bo jutro rano muszę zgłosić dyrekcji listę uczestników. Do tej pory swój udział zadeklarowały tylko Agata i Dorota. Nie ukrywam, że liczę na większą liczbę zawodników. Przypominam też, że udział w sparingu będzie sowicie nagrodzony punktami... - 29.04.2009
- Zauważyłem u Was jakąś wiosenną niemoc twórczą. Przedłużam więc termin nadsyłania zad.10 do dnia 4 maja 2009.
- 7.04.2009
- Do końca Świąt Wielkanocnych macie czas na zrobienie lub poprawienie dwóch ostatnich zadań: zad.7 (ciągi liczb pierwszych) i zad.8 (najkrótsza ścieżka w grafie ważonym).
- 13.02.2009
- Proszę się przygotować do klasówki na najbliższe zajęcia. Zadanie będzie dotyczyło operacji na plikach.
- 1.02.2009
- W tym miejscu będą umieszczane różne informacje dotyczące organizacji zajęć. Proszę je czytać na bieżąco.