Informatika gyűjtemény

Egy szinttel feljebb tb_parc.cs

2004050607080910

NézetNyomtat

tb_parc.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: 5 KB
using System;
using System.IO;

namespace Parcellak
{
    struct Mezo
    {
        int x, y;

        public Mezo(int x, int y)
        {
            this.= x;
            this.= y;
        }

        public int X
        {
            get { return x; }
            set { x = value; }
        }

        public int Y
        {
            get { return y; }
            set { y = value; }
        }

        public override string ToString()
        {
            return (+ ", " + Y);
        }
    }

    struct Parcella
    {
        Mezo balFelso, jobbAlso;

        public Parcella(int felsoX, int felsoY, int alsoX, int alsoY)
        {
            balFelso = new Mezo();
            jobbAlso = new Mezo();

            if (felsoX <= alsoX) {
                balFelso.= felsoX;
                jobbAlso.= alsoX;
            }
            else {
                balFelso.= alsoX;
                jobbAlso.= felsoX;
            }

            if (felsoY <= alsoY) {
                balFelso.= felsoY;
                jobbAlso.= alsoY;
            }
            else {
                balFelso.= alsoY;
                jobbAlso.= felsoY;
            }
        }

        public Parcella(Mezo sarok1, Mezo sarok2)
            : this(sarok1.X, sarok1.Y, sarok2.X, sarok2.Y)
        {
        }

        public int BalSzel
        {
            get { return balFelso.X; }
        }

        public int JobbSzel
        {
            get { return jobbAlso.X; }
        }

        public int FelsoSzel
        {
            get { return balFelso.Y; }
        }

        public int AlsoSzel
        {
            get { return jobbAlso.Y; }
        }

        public int Szelesseg
        {
            get { return (JobbSzel - BalSzel + 1); }
        }

        public int Hosszusag
        {
            get { return (AlsoSzel - FelsoSzel + 1); }
        }

        public int Terulet
        {
            get { return (Szelesseg * Hosszusag); }
        }

        public bool Tartalmaz(Mezo mezo)
        {
            return (
                mezo.>= BalSzel && mezo.<= JobbSzel &&
                mezo.>= FelsoSzel && mezo.<= AlsoSzel
            );
        }

        public override string ToString()
        {
            return string.Format("[{0}], [{1}]", balFelso, jobbAlso);
        }
    }

    class ParcellaHalmaz
    {
        int meret;
        Parcella[] parcellak;

        public ParcellaHalmaz(int kapacitas)
        {
            if (kapacitas < 0) {
                throw new ArgumentOutOfRangeException(
                    "kapacitas", "A kapacitás nem lehet negatív.");
            }

            meret = 0;
            parcellak = new Parcella[kapacitas];
        }

        public int Meret
        {
            get { return meret; }
        }

        public Parcella this[int index]
        {
            get
            {
                if (index < 0 || index >= meret)
                    throw new ArgumentOutOfRangeException("index", "Érvénytelen index.");

                return parcellak[index];
            }
        }

        public void Hozzaad(Parcella parcella)
        {
            if (meret >= parcellak.Length)
                throw new InvalidOperationException("Nincs több hely az új elemnek.");
            
            parcellak[meret++] = parcella;
        }

        public void Torol(int index)
        {
            if (index < 0 || index >= meret)
                throw new ArgumentOutOfRangeException("index", "Érvénytelen index.");

            parcellak[index] = parcellak[--meret];
        }
    }

    class Foldmuves
    {
        Parcella termoFold;
        ParcellaHalmaz parcellak;

        public Foldmuves(int hosszusag, int szelesseg, int felosztasokSzama)
        {
            if (hosszusag <= 0 || hosszusag > 10000)
                throw new ArgumentOutOfRangeException("hosszusag");
            if (szelesseg <= 0 || szelesseg > 10000)
                throw new ArgumentOutOfRangeException("szelesseg");

            termoFold = new Parcella(1, 1, szelesseg, hosszusag);
            parcellak = new ParcellaHalmaz(felosztasokSzama * 3 + 1);
            parcellak.Hozzaad(termoFold);
        }

        public void Feloszt(Mezo metszespont)
        {
            if (metszespont.<= 0 || metszespont.<= 0 ||
                metszespont.> termoFold.Szelesseg || metszespont.> termoFold.Hosszusag)
            {
                throw new ArgumentException("Érvénytelen mező.", "mezo");
            }

            for (int i = 0; i < parcellak.Meret; i++) {
                if (parcellak[i].Tartalmaz(metszespont)) {
                    Darabol(i, metszespont);
                    return;
                }
            }
        }

        private void Darabol(int parcellaIndex, Mezo metszespont)
        {
            if (parcellaIndex < 0 || parcellaIndex >= parcellak.Meret)
                return;

            Parcella regi = parcellak[parcellaIndex];

            parcellak.Torol(parcellaIndex);

            // Bal felső parcella
            if (metszespont.> regi.BalSzel && metszespont.> regi.FelsoSzel) {
                parcellak.Hozzaad(new Parcella(regi.BalSzel, regi.FelsoSzel,
                    metszespont.- 1, metszespont.- 1));
            }

            // Bal alsó parcella
            if (metszespont.> regi.BalSzel && metszespont.< regi.AlsoSzel) {
                parcellak.Hozzaad(new Parcella(regi.BalSzel, metszespont.+ 1,
                    metszespont.- 1, regi.AlsoSzel));
            }

            // Jobb felső parcella
            if (metszespont.< regi.JobbSzel && metszespont.> regi.FelsoSzel) {
                parcellak.Hozzaad(new Parcella(metszespont.+ 1, regi.FelsoSzel,
                    regi.JobbSzel, metszespont.- 1));
            }

            // Bal alsó parcella
            if (metszespont.< regi.JobbSzel && metszespont.< regi.AlsoSzel) {
                parcellak.Hozzaad(new Parcella(metszespont.+ 1, metszespont.+ 1,
                    regi.JobbSzel, regi.AlsoSzel));
            }
        }

        public int LegnagyobbParcellaTerulete()
        {
            int max = 0;

            for (int i = 0; i < parcellak.Meret; i++) {
                if (parcellak[i].Terulet > max)
                    max = parcellak[i].Terulet;
            }
            return max;
        }
    }

    public static class Program
    {
        const string InputFile = "parcellak0.be";

        private static Foldmuves Beolvas(string fileNev)
        {
            using (StreamReader reader = new StreamReader(fileNev))
            {
                string[] elsoSor = reader.ReadLine().Split();

                int n = int.Parse(elsoSor[0]);
                int m = int.Parse(elsoSor[1]);
                int k = int.Parse(elsoSor[2]);

                Foldmuves gazda = new Foldmuves(n, m, k);

                for (int i = 0; i < k; i++) {
                    string[] sor = reader.ReadLine().Split();
                    int x = int.Parse(sor[0]);
                    int y = int.Parse(sor[1]);

                    gazda.Feloszt(new Mezo(x, y));
                }

                return gazda;
            }
        }

        public static void Main(string[] args)
        {
            Foldmuves gazda = Beolvas(InputFile);

            Console.WriteLine(gazda.LegnagyobbParcellaTerulete());
            Console.ReadLine();
        }
    }
}
(Vissza)