.NET 4.x Поиск наибольшего острова - C#

Узнай цену своей работы

Формулировка задачи:

Собственно есть массив X x Y где X>=0 и X<10000; Y>=0 и Y<10000 Массив это байты, надо посчитать максимальный размер острова. Да массив это ЧБ картинка (если точнее градации, к которому был применён порог) Написал вот такой код.
Листинг программы
  1. private Int32 GetMaxSize(byte[,] matrix)
  2. {
  3. var matrix1 = (byte[,])matrix.Clone();
  4. Int32 mSize = 0;
  5. for (var i = 0; i < matrix1.GetLength(0); i++)
  6. for (var j = 0; j < matrix1.GetLength(1); j++)
  7. {
  8. var len = 0;
  9. var size = GetSizeInt(matrix1, i, j, ref len);
  10. if (size > mSize)
  11. {
  12. mSize = size;
  13. //GetBitmapFromGsArray(matrix1).Save($"{i}_{j}.png", ImageFormat.Png); // дебаг
  14. }
  15. }
  16. return mSize;
  17. }
  18. private Int32 GetSizeInt(byte[,] matrix, Int32 i, Int32 j, ref Int32 lenght)
  19. {
  20. if ((i < 0) || (i >= matrix.GetLength(0))) return lenght;
  21. if ((j < 0) || (j >= matrix.GetLength(1))) return lenght;
  22. if (matrix[i, j] > 128)
  23. {
  24. lenght++;
  25. matrix[i, j] = 0;
  26. GetSizeInt(matrix, i, j + 1, ref lenght);
  27. GetSizeInt(matrix, i, j - 1, ref lenght);
  28. GetSizeInt(matrix, i + 1, j, ref lenght);
  29. GetSizeInt(matrix, i - 1, j, ref lenght);
  30. }
  31. return lenght;
  32. }
И C# говорит мне System.StackOverflowException Как можно поправить? На маленьких примерах такой код работает...

Решение задачи: «.NET 4.x Поиск наибольшего острова»

textual
Листинг программы
  1. using System;
  2. using System.Collections.Generic;
  3.  
  4. namespace FirtsApp
  5. {
  6.     class Program
  7.     {
  8.  
  9.         static bool isValidPoint(int i, int j, byte[,] map)
  10.         {
  11.             return ((i >= 0) && (i < map.GetLength(0)) &&
  12.                     (j >= 0) && (j < map.GetLength(1)) &&
  13.                     map[i, j] > 128);
  14.         }
  15.  
  16.         static int GetMaxSize(byte[,] map)
  17.         {
  18.             byte[,] mapCopy = (byte[,])map.Clone();
  19.             int maxSize = 0, tmpSize;
  20.  
  21.             Tuple<int, int>[] delta = {new Tuple<int, int>(-1, 0),
  22.                                         new Tuple<int, int>(0, 1),
  23.                                         new Tuple<int, int>(1, 0),
  24.                                         new Tuple<int, int>(0, -1)};
  25.  
  26.             Stack<Tuple<int, int>> points = new Stack<Tuple<int, int>>();
  27.             int cordX, cordY;
  28.  
  29.             for (int i = 0; i < mapCopy.GetLength(0); ++i)
  30.                 for (int j = 0; j < mapCopy.GetLength(1); ++j)
  31.                 {
  32.                     tmpSize = 0;
  33.                     if (mapCopy[i,j]>128)
  34.                     {
  35.                         points.Clear();
  36.                         Tuple<int, int> curPoint = new Tuple<int, int>(i, j);
  37.                         points.Push(curPoint);
  38.                         mapCopy[i, j] = 0;
  39.                         ++tmpSize;
  40.  
  41.                         while (points.Count > 0)
  42.                         {
  43.                             curPoint = points.Pop();
  44.                             foreach (var d in delta)
  45.                             {
  46.                                 cordX = curPoint.Item2 + d.Item2;
  47.                                 cordY = curPoint.Item1 + d.Item1;
  48.                                 if (isValidPoint(cordY, cordX, mapCopy))
  49.                                 {
  50.                                     ++tmpSize;
  51.                                     mapCopy[cordY, cordX] = 0;
  52.                                     points.Push(new Tuple<int, int>(cordY, cordX));
  53.                                 }
  54.                             }
  55.                            
  56.                         }
  57.                     }
  58.  
  59.                     if (tmpSize > maxSize)
  60.                         maxSize = tmpSize;
  61.                 }
  62.  
  63.             return maxSize;
  64.         }
  65.  
  66.         static void Main()
  67.         {
  68.             byte[,] map = { { 255, 0 }, { 255, 255 } };
  69.             Console.WriteLine(GetMaxSize(map));
  70.         }
  71.        
  72.     }
  73.  
  74. }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 4.067 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы