Advertisement
PseudoInformatyk

Mapa ASD

Oct 28th, 2019
156
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 9.79 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Linq;
  5. using System.Text;
  6. using System.Threading.Tasks;
  7.  
  8. //Na pewnej nowo odkrytej planecie wykonano zdjęcia satelitarne i sporządzono cyfrową mapę
  9. //terenu.Wyróżniono na niej obszary lądowe oraz wodne(rzeki jak i zbiorniki wodne). Na podstawie
  10. //zebranych danych postanowiono zbadać charakterystykę terenu, ze szczególnym uwzględnieniem
  11. //rzek i wysp.Dane są dużych rozmiarów i niezbędne do tego jest specjalistyczne oprogramowanie.
  12. //Mapa obszaru to prostokątny obszar z trzema rodzajami pikseli: ‘x’ oznacza ląd, ‘o’ oznacza wodę
  13. //stojącą, a ‘u’ oznacza rzekę. Spójnym obszarem lądowym nazywamy piksele połączone ze sobą w
  14. //jednym z 8 kierunków mapy (góra, dół, prawo, lewo i skosy). Z kolei spójny obszar wodny to
  15. //piksele połączone ze sobą przynajmniej w jednym z 4 kierunków(góra, dół, lewo, prawo). Wyspą
  16. //nazywamy spójny obszar lądowy z każdej strony otoczony wodą stojącą(czyli nie stykający się z
  17. //krawędzią mapy), na mapie nie ma rzecznych wysp.Z kolei rzeki na mapie zawsze mają szerokość
  18. //1 piksela (z wyjątkiem ujść jednej do drugiej) i zawsze kończą swój bieg w zbiorniku wody stojącej
  19. //lub w innej rzece.Ponadto, rzeki nie rozgałęziają się na równoległe koryta(jak Narew), nie tworzą
  20. //delt i nie ma ich na wyspach.Napisz program, który dokona analizy danych i znajdzie największą
  21. //wyspę i najdłuższą rzekę(mierzoną od ujścia do najdalszego źródła).
  22. //Wejście:
  23. //W pierwszym wierszu wejścia podane są liczby n, m (3 <= n, m <= 1000) oznaczające liczbę kolumn i
  24. //liczbę wierszy mapy.W kolejnym m wierszach podanych jest po n pikseli mapy.
  25. //Wyjście:
  26. //W jedynym wierszu wyjścia mają się pojawić 2 liczby oznaczające odpowiednio powierzchnię
  27. //największej wyspy i długość najdłuższej rzeki.
  28.  
  29. //IN1
  30. //10 10
  31. //oooooooooo
  32. //oxoxooxxoo
  33. //ooxxxoxxoo
  34. //oooooooooo
  35. //xuxxxxxuxx
  36. //xuuxxxxuxx
  37. //xxuuuxxuxx
  38. //xuuxxxuuux
  39. //xuxxuuuxux
  40. //xxxuuxuxuu
  41.  
  42. //OUT 1
  43. //5 10
  44.  
  45. namespace Mapa
  46. {
  47.     class Program
  48.     {
  49.         public static int licznik = 0;
  50.         static void Rzeka(ref char[,] tab, ref int rzeka, ref int m, ref int n, int i, int j)
  51.         {
  52.             licznik++;
  53.             if (i < 0 || j < 0 || i == m || j == n) return; //poza zakresem
  54.             int max = 1;
  55.             tab[i, j] = 'r';
  56.  
  57.             if ((j > 0 && tab[i, j - 1] == 'u'))
  58.             {
  59.                 Rzeka(ref tab, ref max, ref m, ref n, i, j - 1);
  60.                 max++;
  61.                 if (max > rzeka)
  62.                 {
  63.                     rzeka = max;
  64.                     max = 0;
  65.                 }
  66.             }
  67.             if ((i > 0 && tab[i - 1, j] == 'u'))
  68.             {
  69.                 Rzeka(ref tab, ref max, ref m, ref n, i - 1, j);
  70.                 max++;
  71.                 if (max > rzeka)
  72.                 {
  73.                     rzeka = max;
  74.                     max = 0;
  75.                 }
  76.             }
  77.             if ((j < n - 1 && tab[i, j + 1] == 'u'))
  78.             {
  79.                 Rzeka(ref tab, ref max, ref m, ref n, i, j + 1);
  80.                 max++;
  81.                 if (max > rzeka)
  82.                 {
  83.                     rzeka = max;
  84.                     max = 0;
  85.                 }
  86.             }
  87.             if ((i < m - 1 && tab[i + 1, j] == 'u'))
  88.             {
  89.                 Rzeka(ref tab, ref max, ref m, ref n, i + 1, j);
  90.                 max++;
  91.                 if (max > rzeka)
  92.                 {
  93.                     rzeka = max;
  94.                     max = 0;
  95.                 }
  96.             }
  97.         }
  98.         static void Wyspa(ref char[,] tab, ref int wyspa, ref int m, ref int n, int i, int j, ref bool krawedz)
  99.         {
  100.             licznik++;
  101.             //char znak;
  102.             if ((i == 0 || i == m - 1 || j == 0 || j == n - 1) && (tab[i, j] == 'x'))
  103.             {
  104.                 wyspa = 0;
  105.                 tab[i, j] = 'w';
  106.                 krawedz = true;
  107.             }
  108.             else
  109.             {
  110.                 if (krawedz == false)
  111.                 {
  112.                     wyspa += 1;
  113.                 }
  114.                 tab[i, j] = 'w';
  115.                 //znak = tab[i, j];
  116.                 if (tab[i, j - 1] == 'x') Wyspa(ref tab, ref wyspa, ref m, ref n, i, j - 1, ref krawedz);
  117.                 if (tab[i - 1, j - 1] == 'x') Wyspa(ref tab, ref wyspa, ref m, ref n, i - 1, j - 1, ref krawedz);
  118.                 if (tab[i - 1, j] == 'x') Wyspa(ref tab, ref wyspa, ref m, ref n, i - 1, j, ref krawedz);
  119.                 if (tab[i - 1, j + 1] == 'x') Wyspa(ref tab, ref wyspa, ref m, ref n, i - 1, j + 1, ref krawedz);
  120.                 if (tab[i, j + 1] == 'x') Wyspa(ref tab, ref wyspa, ref m, ref n, i, j + 1, ref krawedz);
  121.                 if (tab[i + 1, j + 1] == 'x') Wyspa(ref tab, ref wyspa, ref m, ref n, i + 1, j + 1, ref krawedz);
  122.                 if (tab[i + 1, j] == 'x') Wyspa(ref tab, ref wyspa, ref m, ref n, i + 1, j, ref krawedz);
  123.                 if (tab[i + 1, j - 1] == 'x') Wyspa(ref tab, ref wyspa, ref m, ref n, i + 1, j - 1, ref krawedz);
  124.             }
  125.         }
  126.         static void Wczytywanie(ref int n, ref int m, ref char[,] tab)
  127.         {
  128.             int k = 0;
  129.             string[] oneline = null;
  130.             try
  131.             {
  132.                 using (StreamReader str = new StreamReader("in5.txt"))
  133.                 {
  134.                     string line;
  135.                     while ((line = str.ReadLine()) != null)
  136.                     {
  137.                         if (line.Length == n)
  138.                         {
  139.                             for (int i = 0; i < n; i++)
  140.                             {
  141.                                 tab[k, i] = line[i];
  142.                             }
  143.                             k++;
  144.                         }
  145.                         else
  146.                         {
  147.                             oneline = line.Split(' ');
  148.                             n = int.Parse(oneline[0]);
  149.                             m = int.Parse(oneline[1]);
  150.                             tab = new char[m, n];
  151.                         }
  152.                     }
  153.                 }
  154.             }
  155.             catch (IOException)
  156.             {
  157.                 Console.WriteLine("File not found...");
  158.                 Console.ReadKey();
  159.                 Environment.Exit(0);
  160.             }
  161.  
  162.             Console.WriteLine("Rozmiar tablicy: {0}x{1}", n, m);
  163.             //Console.WriteLine();
  164.             //Console.WriteLine("Tablica: ");
  165.             //for (int i = 0; i < tab.GetLength(0); i++)
  166.             //{
  167.             //    for (int j = 0; j < tab.GetLength(1); j++)
  168.             //    {
  169.             //        Console.Write("{0}", tab[i, j]);
  170.             //    }
  171.             //    Console.WriteLine();
  172.             //}
  173.         }
  174.         static void Zapisywanie(int wyspamax, int rzeka)
  175.         {
  176.             try
  177.             {
  178.                 using (StreamWriter wyj = new StreamWriter("out.txt"))
  179.                 {
  180.                     wyj.Write(wyspamax + " " + rzeka);
  181.                 }
  182.             }
  183.             catch (IOException)
  184.             {
  185.                 Console.WriteLine("Coś poszło nie tak :(");
  186.                 Console.ReadKey();
  187.                 Environment.Exit(0);
  188.             }
  189.         }
  190.         static void Main(string[] args)
  191.         {
  192.             int n = 0; //kolumny
  193.             int m = 0; //wiersze
  194.             int rzeka = 0; //rzeka
  195.             int wyspa = 0, wyspamax = 0; //wyspa
  196.             char[,] tab = null;
  197.             bool krawedz = false;
  198.             Wczytywanie(ref n, ref m, ref tab);
  199.  
  200.             //===============
  201.             //=====WYSPY=====
  202.             //===============
  203.             DateTime now = DateTime.Now;
  204.             for (int i = 1; i < (m - 1) / 2; i++)
  205.             {
  206.                 for (int j = 1; j < n - 1; j++)
  207.                 {
  208.                     licznik++;
  209.                     krawedz = false;
  210.                     if (tab[i, j] == 'x')
  211.                     {
  212.                         Wyspa(ref tab, ref wyspa, ref m, ref n, i, j, ref krawedz);
  213.                         if (wyspa > wyspamax)
  214.                         {
  215.                             wyspamax = wyspa;
  216.                         }
  217.                         wyspa = 0;
  218.                     }
  219.                 }
  220.             }
  221.  
  222.             //Console.WriteLine();
  223.             //Console.WriteLine("Tablica po wyspach: ");
  224.             //for (int i = 0; i < tab.GetLength(0); i++)
  225.             //{
  226.             //    for (int j = 0; j < tab.GetLength(1); j++)
  227.             //    {
  228.             //        Console.Write(tab[i, j] + " ");
  229.             //    }
  230.             //    Console.WriteLine();
  231.             //}
  232.  
  233.             //===============
  234.             //=====RZEKI=====
  235.             //===============
  236.             for (int i = (m - 1) / 2; i < m - 1; i++)
  237.             {
  238.                 for (int j = 1; j < n - 1; j++)
  239.                 {
  240.                     licznik++;
  241.                     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'))
  242.                     {
  243.                         Rzeka(ref tab, ref rzeka, ref m, ref n, i, j);
  244.                     }
  245.                 }
  246.             }
  247.             DateTime end = DateTime.Now;
  248.             Zapisywanie(wyspamax, rzeka);
  249.  
  250.             //=================
  251.             //=====KONSOLA=====
  252.             //=================
  253.             Console.WriteLine();
  254.             Console.WriteLine("Max wyspa: " + wyspamax);
  255.             Console.WriteLine("Max rzeka: " + rzeka);
  256.             Console.WriteLine("Liczba operacji elementarnych: " + licznik);
  257.             Console.WriteLine("Czasy wykonywania się programu: {0} milisekund = {1} sekund", (end - now).TotalMilliseconds, (end - now).TotalSeconds);
  258.             Console.ReadKey();
  259.         }
  260.     }
  261. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement