Найти ошибку в методе поиска локального минимума в двухмерном массиве - C#

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

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

Задача по поиску локального минимума в двумерном массиве. Локальным минимумом считается значение, которое строго меньше всех его соседей. Проверку на локальный минимум реализовал в отдельном методе, вот он:
private bool IsLocalMin(sbyte i, sbyte j, int[,] m)
        {
            sbyte IMinus = Convert.ToSByte(i - 1);
            sbyte JMinus = Convert.ToSByte(j - 1);
            sbyte IPlus = Convert.ToSByte(i + 1);
            sbyte JPlus = Convert.ToSByte(j + 1);
            int a = m[i, j];
 
            if (((IMinus >= 0) && (JMinus >= 0)) && ((IPlus <= (m.GetLength(0) - 2)) && (JPlus <= (m.GetLength(1) - 2)))) //проверка не в углах и не по краям
            {
                for (sbyte x = IMinus; x < IPlus; x++)
                    for (sbyte y = JMinus; y < JPlus; y++)
                        if ((a >= m[x, y]) && (x != i) && (y != j))
                            return false;
                return true;
                
            }

            if ((IMinus < 0) | (JMinus < 0)) //проверка по краям и в углу слева вверху
            {
                if ((IMinus < 0) && (JMinus < 0))
                {
                    for (sbyte x = i; x < IPlus+1; x++)
                        for (sbyte y = j; y < JPlus+1; y++)
                            if ((a >= m[x, y]) && (x != i) && (y != j))
                                return false;
                    return true;
                }
                else if ((JMinus < 0) && (IMinus >= 0))
                {
                    if (IPlus <= (m.GetLength(0) - 1))
                    {
                        for (sbyte x = i; x < IPlus; x++)
                            for (sbyte y = j; y < JPlus; y++)
                                if ((a >= m[x, y]) && (x != i) && (y != j))
                                    return false;
                        return true;
                    }
                    else
                    {
                        for (sbyte x = i; x < IPlus; x++)
                            for (sbyte y = JMinus; y < JPlus; y++)
                                if ((a >= m[x, y]) && (x != i) && (y != j))
                                    return false;
                        return true;
                    }
                }
                else if ((IMinus < 0) && (JMinus >= 0))
                {
                    if (JPlus <= (m.GetLength(1)) - 1)
                    {
                        for (sbyte x = i; x < IPlus; x++)
                            for (sbyte y = j; y < JPlus; y++)
                                if ((a >= m[x, y]) && (x != i) && (y != j))
                                    return false;
                        return true;
                    }
                    else
                    {
                        for (sbyte x = i; x < IPlus; x++)
                            for (sbyte y = JMinus; y < j; y++)
                                if ((a >= m[x, y]) && (x != i) && (y != j))
                                    return false;
                        return true;
                    }
                }

            }
 
            if ((IPlus > (m.GetLength(0) - 1)) | (JPlus > (m.GetLength(1) - 1))) //проверка по краям и в углу снизу справа
            {
                sbyte LenI = Convert.ToSByte(m.GetLength(0) - 1);
                sbyte LenJ = Convert.ToSByte(m.GetLength(1) - 1);
                if ((IPlus > LenI) && (JPlus > LenJ))
                {
                    for (sbyte x = IMinus; x < i; x++)
                        for (sbyte y = JMinus; y < j; y++)
                            if ((a >= m[x, y]) && (x != i) && (y != j))
                                return false;
                    return true;
                }
                else if ((JPlus > LenJ) && (IPlus <= LenI))
                {
                    for (sbyte x = IMinus; x < IPlus; x++)
                        for (sbyte y = JMinus; y < j; y++)
                            if ((a >= m[x, y]) && (x != i) && (y != j))
                                return false;
                    return true;
                }
                else
                {
                    for (sbyte x = IMinus; x < i; x++)
                        for (sbyte y = JMinus; y < JPlus; y++)
                            if ((a >= m[x, y]) && (x != i) && (y != j))
                                return false;
                    return true;
                }
            }
 
            return false;
        }
В результате выходит совсем не то. Пожалуйста, помогите разобраться, где я накосячил. Не ругайте особо, самообучаюсь.

Решение задачи: «Найти ошибку в методе поиска локального минимума в двухмерном массиве»

textual
Листинг программы
var list = new List<Tuple<int, int>>();

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


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

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

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