public podzbior(List <punkt> lista) { punkty = new List <punkt>(lista); policzKozen(); koszt = 0; galaz = new List <linia>(); if (punkty.Count == 2) { dodajLinie(punkty[0], kozen); dodajLinie(punkty[1], kozen); foreach (linia l in galaz) { koszt = koszt + l.dlugosc(); } } if (punkty.Count > 2) { foreach (punkt p in punkty) { List <punkt> tmp = new List <punkt>(punkty); tmp.Remove(p); podzbior mniejszy = Program.szukaj(tmp); if (koszt == 0) { galaz = new List <linia>(mniejszy.dajGalaz()); punkt malyKozen = mniejszy.dajKozen(); dodajLinie(malyKozen, kozen); dodajLinie(p, kozen); foreach (linia l in galaz) { koszt = koszt + l.dlugosc(); } } else { List <linia> staraGalonz = new List <linia>(galaz); galaz = new List <linia>(mniejszy.dajGalaz()); punkt malyKozen = mniejszy.dajKozen(); dodajLinie(malyKozen, kozen); dodajLinie(p, kozen); int nowyKoszt = 0; foreach (linia l in galaz) { nowyKoszt = nowyKoszt + l.dlugosc(); } if (nowyKoszt < koszt) { koszt = nowyKoszt; } else { galaz = new List <linia>(staraGalonz); } } } } }
public void dodajLinie(punkt p1, punkt p2) { if (p1.dajX() == p2.dajX() && p1.dajY() == p2.dajY()) { return; } if (p1.dajX() == p2.dajX() || p1.dajY() == p2.dajY()) { galaz.Add(new linia(p1, p2)); return; } punkt tmp = new punkt(Math.Max(p1.dajX(), p2.dajX()), Math.Min(p1.dajY(), p2.dajY())); dodajLinie(p1, tmp); dodajLinie(p2, tmp); }
private void policzKozen() { int x = punkty[0].dajX(); int y = punkty[0].dajY(); foreach (punkt p in punkty) { if (p.dajX() < x) { x = p.dajX(); } if (p.dajY() < y) { y = p.dajY(); } } kozen = new punkt(x, y); }
static void Main(string[] args) { policzone = new List <podzbior>(); var s = new FileInfo(Directory.GetCurrentDirectory()); var s2 = s.Directory.Parent.Parent; String sciezka = s2.ToString() + "\\dane.csv"; List <punkt> punkty = new List <punkt>(); punkt tmp; using (var reader = new StreamReader(sciezka)) { while (!reader.EndOfStream) { var line = reader.ReadLine(); var values = line.Split(','); tmp = new punkt(Convert.ToInt32(values[0]), Convert.ToInt32(values[1])); punkty.Add(tmp); } } List <string> maski = new List <string>(); for (int x = 1; x <= (Math.Pow(2, punkty.Count) - 1); x++) { string maska = Convert.ToString(x, 2); while (maska.Length < punkty.Count) { maska = "0" + maska; } maski.Add(maska); } for (int x = 1; x < punkty.Count; x++) { foreach (string maska in maski) { int suma = 0; foreach (char c in maska) { if (c == '1') { suma++; } } if (suma == x) { List <punkt> nowa = new List <punkt>(); for (int i = 0; i < punkty.Count; i++) { if (maska[i] == '1') { nowa.Add(punkty[i]); } } podzbior nowy = new podzbior(nowa); policzone.Add(nowy); } } } podzbior wynik = new podzbior(punkty); wynik.ukozen(); List <linia> rozwiazanie = wynik.dajGalaz(); foreach (linia l in rozwiazanie) { l.napisz(); } Console.ReadKey(); }
public linia(punkt P1, punkt P2) { p1 = P1; p2 = P2; }
public void ukozen() { punkt zero = new punkt(0, 0); dodajLinie(zero, kozen); }