Informatika gyűjtemény

Egy szinttel feljebb tb_regiok.cs

2004050607080910

NézetNyomtat

tb_regiok.cs (Vissza)
Az alábbi letöltési lehetőségek közül választhatsz: (segítség)
Karakterkódolás:
Sortörés:
Típus: text/plain
Tartalmaz szöveget
Karakterkódolás: utf-8
Méret: 4 KB
using System;
using System.IO;

namespace Regiok
{
    class Telepules : IComparable<Telepules>
    {
        static int aktualSorszam = 0;

        int x;
        int y;
        int sorszam;

        public Telepules(int x, int y)
        {
            X = x;
            Y = y;
            sorszam = ++aktualSorszam;
        }

        public int X
        {
            get
            {
                return x;
            }
            set
            {
                if (value < 0 || value > 1000)
                    throw new ArgumentOutOfRangeException("value");

                x = value;
            }
        }

        public int Y
        {
            get
            {
                return y;
            }
            set
            {
                if (value < 0 || value > 1000)
                    throw new ArgumentOutOfRangeException("value");

                y = value;
            }
        }

        public int Sorszam
        {
            get { return sorszam; }
        }

        public int Tavolsag(Telepules telepules)
        {
            if (telepules == null)
                throw new ArgumentNullException("telepules");

            return (Math.Abs(this.- telepules.X) + Math.Abs(this.- telepules.Y));
        }

        public static int Tavolsag(Telepules telepules1, Telepules telepules2)
        {
            if (telepules1 == null)
                throw new ArgumentNullException("telepules1");
            if (telepules2 == null)
                throw new ArgumentNullException("telepules2");

            return telepules1.Tavolsag(telepules2);
        }

        public int CompareTo(Telepules telepules)
        {
            return (this.Sorszam - telepules.Sorszam);
        }

        public override string ToString()
        {
            return string.Format("Sorszám: {0}", Sorszam);
        }
    }

    class Regio
    {
        const int MaxTelepulesSzam = 100;

        Telepules[] telepulesek = new Telepules[MaxTelepulesSzam];
        int telepulesekSzama = 0;

        public int TelepulesekSzama
        {
            get { return telepulesekSzama; }
        }

        public void Egyesit(Regio regio)
        {
            if (regio == null)
                throw new ArgumentNullException("regio");
            if (this.TelepulesekSzama + regio.TelepulesekSzama > MaxTelepulesSzam)
                throw new InvalidOperationException("Nem lehet egyesíteni a két régiót.");

            for (int i = 0; i < regio.TelepulesekSzama; i++)
                telepulesek[telepulesekSzama++] = regio.telepulesek[i];
            regio.telepulesekSzama = 0;
        }

        public bool Szomszedos(Telepules telepules, int tavolsag)
        {
            if (telepules == null)
                throw new ArgumentNullException("telepules");

            for (int i = 0; i < telepulesekSzama; i++) {
                if (telepules.Tavolsag(telepulesek[i]) <= tavolsag)
                    return true;
            }
            return false;
        }

        public void Hozzaad(Telepules telepules)
        {
            if (telepules == null)
                throw new ArgumentNullException("telepules");
            if (telepulesekSzama >= telepulesek.Length)
                throw new InvalidOperationException("A régió nem tartalmazhat több települést.");

            telepulesek[telepulesekSzama++] = telepules;
        }

        public void Kiir(TextWriter writer)
        {
            if (writer == null)
                return;

            Array.Sort(telepulesek, 0, telepulesekSzama);

            for (int i = 0; i < telepulesekSzama; i++)
                writer.Write("{0} ", telepulesek[i].Sorszam);
            Console.WriteLine();
        }
    }

    class Megye
    {
        Regio[] regiok;
        int regiokSzama;
        int maxTavolsag;

        public Megye(int maxRegioSzam, int maxTavolsag)
        {
            if (maxRegioSzam < 1 || maxRegioSzam > 100)
                throw new ArgumentOutOfRangeException("maxRegioSzam");
            if (maxTavolsag < 1 || maxTavolsag > 1000)
                throw new ArgumentOutOfRangeException("maxTavolsag");

            regiok = new Regio[maxRegioSzam];
            this.maxTavolsag = maxTavolsag;
        }

        public void UjTelepules(Telepules telepules)
        {
            if (telepules == null)
                throw new ArgumentNullException("telepules");

            int besoroltRegio = -1;

            for (int i = 0; i < regiokSzama; i++) {
                if (regiok[i].Szomszedos(telepules, maxTavolsag)) {
                    if (besoroltRegio == -1) {
                        regiok[i].Hozzaad(telepules);
                        besoroltRegio = i;
                    }
                    else {
                        regiok[besoroltRegio].Egyesit(regiok[i]);
                        Torol(i);
                    }
                }
            }

            if (besoroltRegio == -1) {
                Regio regio = new Regio();

                regio.Hozzaad(telepules);
                regiok[regiokSzama++] = regio;
            }
        }

        private void Torol(int index)
        {
            if (index < 0 || index >= regiokSzama)
                return;

            regiok[index] = regiok[--regiokSzama];
        }

        public void Kiir(TextWriter writer)
        {
            if (writer == null)
                return;

            writer.WriteLine(regiokSzama);
            for (int i = 0; i < regiokSzama; i++)
                regiok[i].Kiir(writer);
        }
    }

    public class Progam
    {
        private static Megye Beolvas(string fileNev)
        {
            using (StreamReader reader = new StreamReader(fileNev))
            {
                string[] elso = reader.ReadLine().Split();
                int n = int.Parse(elso[0]);
                int t = int.Parse(elso[1]);

                Megye regiok = new Megye(n, t);
                for (int i = 1; i <= n; i++) {
                    string[] sor = reader.ReadLine().Split();
                    int x = int.Parse(sor[0]);
                    int y = int.Parse(sor[1]);

                    regiok.UjTelepules(new Telepules(x, y));
                }

                return regiok;
            }
        }

        public static void Main(string[] args)
        {
            Megye regiok = Beolvas("regio.be8");

            regiok.Kiir(Console.Out);
            Console.ReadLine();
        }
    }
}
(Vissza)