Подсчитать количество локальных минимумов в матрице - 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;
        }
    }

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


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

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

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