Удаление более мощной строки - C#
Формулировка задачи:
Имеется матрица(задана в виде списка). Элементы нули и единицы. Задание такое: если одна строка является подмножеством второй, то удаляется более мощная строка. Например, есть строки: первая 1 0 0 1 1 и вторая 0 0 0 1 1. Здесь мощность определяется индексами элементов, в которых значения равно 1. Т. е. смотрим индексы на которых стоят единицы в строках: первая строка {0, 3, 4}, вторая строка {3, 4}. Удаляется первая строка, т. к. она включает в себя элементы, которые есть во второй строке.
Подскажите, каким образом это реализовать?
List<List<int>> matrixA = new List<List<int>>() {
new List<int>() { 1,0,0,1,1},
new List<int>(){ 0,0,0,1,1},
new List<int>(){ 1,0,1,1,0 },
new List<int>(){ 0,1,1,0,1 },
new List<int>(){ 0,1,0,0,1 },
new List<int>(){ 1,0,0,1,0 },
new List<int>(){ 0,0,0,1,1 },
new List<int>(){ 1,1,0,0,0 }};Решение задачи: «Удаление более мощной строки»
textual
Листинг программы
static class ListExtensions
{
public static bool IsSupersetOf(this List<int> left, List<int> right)
{
for (int i = 0; i < left.Count; ++i)
if (left[i] == 0 && right[i] == 1)
return false;
return true;
}
}
public class Program
{
public static void Main(string[] args)
{
List<List<int>> matrixA = new List<List<int>>() {
new List<int>() { 1,0,0,1,1},
new List<int>(){ 0,0,0,1,1},
new List<int>(){ 1,0,1,1,0 },
new List<int>(){ 0,1,1,0,1 },
new List<int>(){ 0,1,0,0,1 },
new List<int>(){ 1,0,0,1,0 },
new List<int>(){ 0,0,0,1,1 },
new List<int>(){ 1,1,0,0,0 }};
for (int i = 0; i < matrixA.Count; ++i)
for (int j = 0; j < matrixA.Count; ++j)
if (i != j && matrixA[i].IsSupersetOf(matrixA[j]))
{
matrixA.RemoveAt(i--);
break;
}
Console.WriteLine(string.Join(Environment.NewLine, matrixA.Select(row => string.Join(" ", row))));
}
}