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

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

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

Собственно есть массив X x Y где X>=0 и X<10000; Y>=0 и Y<10000 Массив это байты, надо посчитать максимальный размер острова. Да массив это ЧБ картинка (если точнее градации, к которому был применён порог) Написал вот такой код.
        private Int32 GetMaxSize(byte[,] matrix)
        {
            var matrix1 = (byte[,])matrix.Clone();
            Int32 mSize = 0;
            for (var i = 0; i < matrix1.GetLength(0); i++)
                for (var j = 0; j < matrix1.GetLength(1); j++)
                {
                    var len = 0;
                    var size = GetSizeInt(matrix1, i, j, ref len);
                    if (size > mSize)
                    {
                        mSize = size;
                        //GetBitmapFromGsArray(matrix1).Save($"{i}_{j}.png", ImageFormat.Png); // дебаг
                    }
                }
            return mSize;
        }
 
        private Int32 GetSizeInt(byte[,] matrix, Int32 i, Int32 j, ref Int32 lenght)
        {
            if ((i < 0) || (i >= matrix.GetLength(0))) return lenght;
            if ((j < 0) || (j >= matrix.GetLength(1))) return lenght;
            if (matrix[i, j] > 128)
            {
                lenght++;
                matrix[i, j] = 0;
                GetSizeInt(matrix, i, j + 1, ref lenght);
                GetSizeInt(matrix, i, j - 1, ref lenght);
                GetSizeInt(matrix, i + 1, j, ref lenght);
                GetSizeInt(matrix, i - 1, j, ref lenght);
            }
            return lenght;
        }
И C# говорит мне System.StackOverflowException Как можно поправить? На маленьких примерах такой код работает...

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

textual
Листинг программы
using System;
using System.Collections.Generic;
 
namespace FirtsApp
{
    class Program
    {
 
        static bool isValidPoint(int i, int j, byte[,] map)
        {
            return ((i >= 0) && (i < map.GetLength(0)) &&
                    (j >= 0) && (j < map.GetLength(1)) &&
                    map[i, j] > 128);
        }
 
        static int GetMaxSize(byte[,] map)
        {
            byte[,] mapCopy = (byte[,])map.Clone();
            int maxSize = 0, tmpSize;
 
            Tuple<int, int>[] delta = {new Tuple<int, int>(-1, 0),
                                        new Tuple<int, int>(0, 1),
                                        new Tuple<int, int>(1, 0),
                                        new Tuple<int, int>(0, -1)};
 
            Stack<Tuple<int, int>> points = new Stack<Tuple<int, int>>();
            int cordX, cordY;
 
            for (int i = 0; i < mapCopy.GetLength(0); ++i)
                for (int j = 0; j < mapCopy.GetLength(1); ++j)
                {
                    tmpSize = 0;
                    if (mapCopy[i,j]>128)
                    {
                        points.Clear();
                        Tuple<int, int> curPoint = new Tuple<int, int>(i, j);
                        points.Push(curPoint);
                        mapCopy[i, j] = 0;
                        ++tmpSize;
 
                        while (points.Count > 0)
                        {
                            curPoint = points.Pop();
                            foreach (var d in delta)
                            {
                                cordX = curPoint.Item2 + d.Item2;
                                cordY = curPoint.Item1 + d.Item1;
                                if (isValidPoint(cordY, cordX, mapCopy))
                                {
                                    ++tmpSize;
                                    mapCopy[cordY, cordX] = 0;
                                    points.Push(new Tuple<int, int>(cordY, cordX));
                                }
                            }
                            
                        }
                    }
 
                    if (tmpSize > maxSize)
                        maxSize = tmpSize;
                }
 
            return maxSize;
        }
 
        static void Main()
        {
            byte[,] map = { { 255, 0 }, { 255, 255 } };
            Console.WriteLine(GetMaxSize(map));
        }
        
    }
 
}

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


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

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

15   голосов , оценка 4.067 из 5
Похожие ответы