Найти ошибку в методе поиска локального минимума в двухмерном массиве - 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>>();