Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Collections.Generic;
- using System.IO;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- //Na pewnej nowo odkrytej planecie wykonano zdjęcia satelitarne i sporządzono cyfrową mapę
- //terenu.Wyróżniono na niej obszary lądowe oraz wodne(rzeki jak i zbiorniki wodne). Na podstawie
- //zebranych danych postanowiono zbadać charakterystykę terenu, ze szczególnym uwzględnieniem
- //rzek i wysp.Dane są dużych rozmiarów i niezbędne do tego jest specjalistyczne oprogramowanie.
- //Mapa obszaru to prostokątny obszar z trzema rodzajami pikseli: ‘x’ oznacza ląd, ‘o’ oznacza wodę
- //stojącą, a ‘u’ oznacza rzekę. Spójnym obszarem lądowym nazywamy piksele połączone ze sobą w
- //jednym z 8 kierunków mapy (góra, dół, prawo, lewo i skosy). Z kolei spójny obszar wodny to
- //piksele połączone ze sobą przynajmniej w jednym z 4 kierunków(góra, dół, lewo, prawo). Wyspą
- //nazywamy spójny obszar lądowy z każdej strony otoczony wodą stojącą(czyli nie stykający się z
- //krawędzią mapy), na mapie nie ma rzecznych wysp.Z kolei rzeki na mapie zawsze mają szerokość
- //1 piksela (z wyjątkiem ujść jednej do drugiej) i zawsze kończą swój bieg w zbiorniku wody stojącej
- //lub w innej rzece.Ponadto, rzeki nie rozgałęziają się na równoległe koryta(jak Narew), nie tworzą
- //delt i nie ma ich na wyspach.Napisz program, który dokona analizy danych i znajdzie największą
- //wyspę i najdłuższą rzekę(mierzoną od ujścia do najdalszego źródła).
- //Wejście:
- //W pierwszym wierszu wejścia podane są liczby n, m (3 <= n, m <= 1000) oznaczające liczbę kolumn i
- //liczbę wierszy mapy.W kolejnym m wierszach podanych jest po n pikseli mapy.
- //Wyjście:
- //W jedynym wierszu wyjścia mają się pojawić 2 liczby oznaczające odpowiednio powierzchnię
- //największej wyspy i długość najdłuższej rzeki.
- //IN1
- //10 10
- //oooooooooo
- //oxoxooxxoo
- //ooxxxoxxoo
- //oooooooooo
- //xuxxxxxuxx
- //xuuxxxxuxx
- //xxuuuxxuxx
- //xuuxxxuuux
- //xuxxuuuxux
- //xxxuuxuxuu
- //OUT 1
- //5 10
- namespace Mapa
- {
- class Program
- {
- public static int licznik = 0;
- static void Rzeka(ref char[,] tab, ref int rzeka, ref int m, ref int n, int i, int j)
- {
- licznik++;
- if (i < 0 || j < 0 || i == m || j == n) return; //poza zakresem
- int max = 1;
- tab[i, j] = 'r';
- if ((j > 0 && tab[i, j - 1] == 'u'))
- {
- Rzeka(ref tab, ref max, ref m, ref n, i, j - 1);
- max++;
- if (max > rzeka)
- {
- rzeka = max;
- max = 0;
- }
- }
- if ((i > 0 && tab[i - 1, j] == 'u'))
- {
- Rzeka(ref tab, ref max, ref m, ref n, i - 1, j);
- max++;
- if (max > rzeka)
- {
- rzeka = max;
- max = 0;
- }
- }
- if ((j < n - 1 && tab[i, j + 1] == 'u'))
- {
- Rzeka(ref tab, ref max, ref m, ref n, i, j + 1);
- max++;
- if (max > rzeka)
- {
- rzeka = max;
- max = 0;
- }
- }
- if ((i < m - 1 && tab[i + 1, j] == 'u'))
- {
- Rzeka(ref tab, ref max, ref m, ref n, i + 1, j);
- max++;
- if (max > rzeka)
- {
- rzeka = max;
- max = 0;
- }
- }
- }
- static void Wyspa(ref char[,] tab, ref int wyspa, ref int m, ref int n, int i, int j, ref bool krawedz)
- {
- licznik++;
- //char znak;
- if ((i == 0 || i == m - 1 || j == 0 || j == n - 1) && (tab[i, j] == 'x'))
- {
- wyspa = 0;
- tab[i, j] = 'w';
- krawedz = true;
- }
- else
- {
- if (krawedz == false)
- {
- wyspa += 1;
- }
- tab[i, j] = 'w';
- //znak = tab[i, j];
- if (tab[i, j - 1] == 'x') Wyspa(ref tab, ref wyspa, ref m, ref n, i, j - 1, ref krawedz);
- if (tab[i - 1, j - 1] == 'x') Wyspa(ref tab, ref wyspa, ref m, ref n, i - 1, j - 1, ref krawedz);
- if (tab[i - 1, j] == 'x') Wyspa(ref tab, ref wyspa, ref m, ref n, i - 1, j, ref krawedz);
- if (tab[i - 1, j + 1] == 'x') Wyspa(ref tab, ref wyspa, ref m, ref n, i - 1, j + 1, ref krawedz);
- if (tab[i, j + 1] == 'x') Wyspa(ref tab, ref wyspa, ref m, ref n, i, j + 1, ref krawedz);
- if (tab[i + 1, j + 1] == 'x') Wyspa(ref tab, ref wyspa, ref m, ref n, i + 1, j + 1, ref krawedz);
- if (tab[i + 1, j] == 'x') Wyspa(ref tab, ref wyspa, ref m, ref n, i + 1, j, ref krawedz);
- if (tab[i + 1, j - 1] == 'x') Wyspa(ref tab, ref wyspa, ref m, ref n, i + 1, j - 1, ref krawedz);
- }
- }
- static void Wczytywanie(ref int n, ref int m, ref char[,] tab)
- {
- int k = 0;
- string[] oneline = null;
- try
- {
- using (StreamReader str = new StreamReader("in5.txt"))
- {
- string line;
- while ((line = str.ReadLine()) != null)
- {
- if (line.Length == n)
- {
- for (int i = 0; i < n; i++)
- {
- tab[k, i] = line[i];
- }
- k++;
- }
- else
- {
- oneline = line.Split(' ');
- n = int.Parse(oneline[0]);
- m = int.Parse(oneline[1]);
- tab = new char[m, n];
- }
- }
- }
- }
- catch (IOException)
- {
- Console.WriteLine("File not found...");
- Console.ReadKey();
- Environment.Exit(0);
- }
- Console.WriteLine("Rozmiar tablicy: {0}x{1}", n, m);
- //Console.WriteLine();
- //Console.WriteLine("Tablica: ");
- //for (int i = 0; i < tab.GetLength(0); i++)
- //{
- // for (int j = 0; j < tab.GetLength(1); j++)
- // {
- // Console.Write("{0}", tab[i, j]);
- // }
- // Console.WriteLine();
- //}
- }
- static void Zapisywanie(int wyspamax, int rzeka)
- {
- try
- {
- using (StreamWriter wyj = new StreamWriter("out.txt"))
- {
- wyj.Write(wyspamax + " " + rzeka);
- }
- }
- catch (IOException)
- {
- Console.WriteLine("Coś poszło nie tak :(");
- Console.ReadKey();
- Environment.Exit(0);
- }
- }
- static void Main(string[] args)
- {
- int n = 0; //kolumny
- int m = 0; //wiersze
- int rzeka = 0; //rzeka
- int wyspa = 0, wyspamax = 0; //wyspa
- char[,] tab = null;
- bool krawedz = false;
- Wczytywanie(ref n, ref m, ref tab);
- //===============
- //=====WYSPY=====
- //===============
- DateTime now = DateTime.Now;
- for (int i = 1; i < (m - 1) / 2; i++)
- {
- for (int j = 1; j < n - 1; j++)
- {
- licznik++;
- krawedz = false;
- if (tab[i, j] == 'x')
- {
- Wyspa(ref tab, ref wyspa, ref m, ref n, i, j, ref krawedz);
- if (wyspa > wyspamax)
- {
- wyspamax = wyspa;
- }
- wyspa = 0;
- }
- }
- }
- //Console.WriteLine();
- //Console.WriteLine("Tablica po wyspach: ");
- //for (int i = 0; i < tab.GetLength(0); i++)
- //{
- // for (int j = 0; j < tab.GetLength(1); j++)
- // {
- // Console.Write(tab[i, j] + " ");
- // }
- // Console.WriteLine();
- //}
- //===============
- //=====RZEKI=====
- //===============
- for (int i = (m - 1) / 2; i < m - 1; i++)
- {
- for (int j = 1; j < n - 1; j++)
- {
- licznik++;
- if (tab[i, j] == 'u' && (tab[i, j - 1] == 'o' || tab[i - 1, j] == 'o' || tab[i, j + 1] == 'o' || tab[i + 1, j] == 'o'))
- {
- Rzeka(ref tab, ref rzeka, ref m, ref n, i, j);
- }
- }
- }
- DateTime end = DateTime.Now;
- Zapisywanie(wyspamax, rzeka);
- //=================
- //=====KONSOLA=====
- //=================
- Console.WriteLine();
- Console.WriteLine("Max wyspa: " + wyspamax);
- Console.WriteLine("Max rzeka: " + rzeka);
- Console.WriteLine("Liczba operacji elementarnych: " + licznik);
- Console.WriteLine("Czasy wykonywania się programu: {0} milisekund = {1} sekund", (end - now).TotalMilliseconds, (end - now).TotalSeconds);
- Console.ReadKey();
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement