Подсчитать количество локальных минимумов в матрице - C#
Формулировка задачи:
Соседями элемента в данной задаче являются переменные, как слева-справа, так и сверху-снизу?
"Дана вещественная матрица M x N, заполненная случайными числами. Соседями
элемента aij являются элементы akl:
i-1<=k<=i+1; j-1<=l<=j+1, причем (i,j)!=(k,l). Подсчитать количество локальных
минимумов в матрице. Локальный минимум – элемент, строго меньший всех своих
соседей."
Решение задачи: «Подсчитать количество локальных минимумов в матрице»
textual
Листинг программы
class Program { static void Main(string[] args) { double[,] m = new double[7, 7]; m.FillWithRandom();//Заполнение матрицы m.Print(m.FindLocalMins());//Подсчёт локальных минимумов и вывод в консоль Console.Read(); } } public static class Matrix { /// <summary> /// Вывод матрицы в консоль с подсветкой указанных элементов /// </summary> /// <param name="m">матрица</param> /// <param name="addresses">Адреса элементов, которые нужно подсветить</param> public static void Print(this double[,] m, params Address[] addresses) { for (int i = 0; i < m.GetLength(0); i++) { for (int j = 0; j < m.GetLength(1); j++) { if (addresses.Contains(new Address(i, j))) Console.ForegroundColor = ConsoleColor.Yellow; Console.Write("{0,-9:f3}", m[i, j]); Console.ResetColor(); } Console.WriteLine(); } } /// <summary> /// Поиск локальных минимумов — элементов, которые меньше своих соседей по строке и столбцу /// </summary> /// <param name="m">Матрица</param> /// <returns></returns> public static Address[] FindLocalMins(this double[,] m) { List<Address> list = new List<Address>(); for (int i = 1; i < m.GetLength(0) - 1; i++) { for (int j = 1; j < m.GetLength(1) - 1; j++) { if (!(m[i, j] < m[i - 1, j] && m[i, j] < m[i, j + 1] && m[i, j] < m[i + 1, j] && m[i, j] < m[i, j - 1])) continue; list.Add(new Address(i, j)); } } Address[] result = new Address[list.Count]; list.CopyTo(result); return result; } /// <summary> /// Заполнение матрицы случайными числами /// </summary> /// <param name="m">Матрица</param> public static void FillWithRandom(this double[,] m) { Random rnd = new Random(DateTime.Now.Millisecond); for (int i = 0; i < m.GetLength(0); i++) { for (int j = 0; j < m.GetLength(1); j++) { m[i, j] = rnd.NextDouble(-m.Length, m.Length); } } } } /// <summary> /// Адрес элемента в матрице /// </summary> public struct Address { /// <summary> /// Номер строки /// </summary> public int Row { get; private set; } /// <summary> /// Номер столбца /// </summary> public int Column { get; private set; } public Address(int i, int j) : this() { Row = i; Column = j; } } /// <summary> /// Класс расширений для Random /// </summary> public static class ExtRandom { public static double NextDouble(this Random rnd, double max, double min) { return rnd.NextDouble() * (max - min) + min; } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д