コード例 #1
0
 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);
                 }
             }
         }
     }
 }
コード例 #2
0
        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);
        }
コード例 #3
0
        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);
        }
コード例 #4
0
        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();
        }
コード例 #5
0
 public linia(punkt P1, punkt P2)
 {
     p1 = P1;
     p2 = P2;
 }
コード例 #6
0
        public void ukozen()
        {
            punkt zero = new punkt(0, 0);

            dodajLinie(zero, kozen);
        }