Как доработать код c#, чтобы выполнялась задача ( двумерные массивы )?
Дана целочисленная матрица размера M × N, элементы которой могут принимать значения от 0 до 100. Различные столбцы матрицы назовем похожими, если совпадают множества чисел, встречающихся в этих столбцах. Найти количество столбцов, похожих на последний столбец данной матрицы.
в main в циклах for нужно, чтобы нашло похожие значение чисел как в последнем столбце в других столбцах, но у меня программа считает положения и работает оно неправильно, помогите
static void Main(string[] args)
{
Console.WriteLine("введите количество строк");
int m = Convert.ToInt32(Console.ReadLine());
Console.WriteLine("введите количество столбцов");
int n = Convert.ToInt32(Console.ReadLine());
int[,] mas = new int[m, n];
Fill(ref mas);
Print(mas);
int count = 0;
for (int i = 1; i < n; i++)
{
for (int t = 0; t < m; t++)
{
if (mas[t,mas.GetLength(1) - 1] == mas[t, i])
{
count++;
break;
}
}
}
Console.WriteLine("Количество столбцов, похожих на последний столбец матрицы = " + count);
Console.ReadKey();
}
public static void Print(int[,] mas)
{
for (int i = 0; i < mas.GetLength(0); i++)
{
for (int j = 0; j < mas.GetLength(1); j++)
{
Console.Write($"|{mas[i, j],3}");
}
Console.WriteLine();
}
}
public static void Fill(ref int[,] mas)
{
Random rnd = new Random();
for (int i = 0; i < mas.GetLength(0); i++)
{
for (int j = 0; j < mas.GetLength(1); j++)
{
mas[i, j] = rnd.Next(0, 100); ;
}
}
}
Ответы (2 шт):
Вам же нужно множество, т.е. набор чисел, поэтому позиции значения не имеют.
Во-первых, вы можете создать HashSet, положив в него элементы последнего столбца, а потом для другого столбца проверять, что каждый его элемент есть в HashSet (Contains)
Если в учебном задании пока не разрешается использовать подобные классы - вы можете просто сделать массив длиной 101, заполненный сначала нулями, и установить для каждого элемента последнего столбца соответствующую ячейку массива в единицу (A[mas[i,n-1]] = 1]), и далее сверять другие столбцы с ячейками массива.
Вот решение. Суть в том, чтобы сравнивать между собой два упорядоченных одномерных массива через SequenceEqual.
using System;
static int LastColCounter(int m, int n)
{
int[,] arr = new int[m, n]; // Массив со случайными числами
int[] lastCol = new int[m]; // Массив с крайним столбцом
int[] tmpArr = new int[m]; // Массив с очередным столбцом
int count = 0; // Счетчик похожих столбцов
// Заполняем массив arr случайными числами
for (int i = 0; i < m; i++)
{
for (int j = 0; j < n; j++)
{
arr[i, j] = new Random().Next(0, 101);
// Заполняем массив lastCol элементами крайнего столбца
if (j == n - 1) lastCol[i] = arr[i, j];
}
}
// Сортируем массив по возрастанию
Array.Sort(lastCol);
// Сравниваем каждый столбец с крайним
for (int j = 0; j < n - 1; j++)
{
for (int i = 0; i < m; i++)
{
tmpArr[i] = arr[i, j];
}
// Сортируем каждый столбец по возрастанию
Array.Sort(tmpArr);
// Если очередной и крайний столбцы эквивалентны,
// то увеличиваем счетчик
if (tmpArr.SequenceEqual(lastCol)) count++;
}
return count;
}