我正在尝试使用一些简单的方法来消除数据结构列中的任何冲突。
我有 int 列表的列表,例如!
0 0 0 2 3 4
1 0 2 3 0 0
0 2 1 4 0 0
正如您只看到 5 个数字 0、1、2、3、4,我希望在 中有相同 数字或零>每个列。上面的例子应该是这样的:
0 0 0 2 3 4 0 0 0 0 0 0
1 0 2 0 0 0 2 3 0 0 0 0
0 2 0 0 0 0 0 0 1 4 0 0
所以我为此用 C# 编写了一个简单的程序:
for (int t1 = 0; t1 < myList.Count; t1++)
{
for (int t2 = 0; t2 < myList[t1].Count; t2++)
{
for (int t3 = 0; t3 < myList.Count; t3++)
{
if (myList[t1][t2] != myList[t3][t2])
{
if (myList[t1][t2] != 0)
{
if (myList[t3][t2] != 0)
{
myList[t3].Insert(t2, 0);
for (int uui = 0; uui < myList.Count; uui++)
{
if (uui != t3)
{
myList[uui].Add(0);
}
}
}
}
}
}
}
}
如您所见,我正在按列搜索,它会向每个子列表添加零,但带有插入的子列表除外,以避免超出范围的异常。 有趣的是它通常 有效!但在某些情况下仍然存在冲突。 我的问题是为什么它只适用于某些情况(通常是最大 5x5 的小情况)?
此数据集的另一个示例:
0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 4 3 4 3 3
1 0 0 0 0 0 1 4 3 2 2 0 0 0 0 0 0 0 0 0 0 0
1 0 0 0 0 0 0 0 0 2 0 3 2 2 4 0 0 0 0 0 0 0
0 0 3 0 0 0 0 0 0 2 0 3 0 0 0 3 4 3 0 0 0 0
0 4 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 1 2 4 1
0 0 3 0 3 0 1 0 3 0 0 0 0 0 4 3 0 0 0 0 0 0
结果是:
0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 4 3 4 3 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
1 0 0 0 0 0 1 4 3 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
1 0 0 0 0 0 0 0 0 2 0 3 2 2 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 3 0 0 0 0 0 0 2 0 3 0 0 0 3 4 0 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 4 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 1 2 4 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 3 0 0 3 0 0 0 0 0 0 0 0 0 0 0 1 0 3 0 0 0 0 0 0 4 3 0 0 0 0 0 0 0 0 0 0 0 0
不幸的是,冲突仍然存在:第一个列表从右边开始的第一个“3”在第四个列表中有下面的数字 1。第一个列表中的“4”在列表 nr 4 的下面有“3”。
最佳答案
当您遇到冲突时,您将在该行的末尾添加。 尝试解决整个列的冲突。 因此,较低的行不能添加冲突,这些冲突不会在以后的迭代中解决。
一个完整的测试程序:
void Main()
{
// var s = "0 0 0 2 3 4\r\n1 0 2 3 0 0\r\n0 2 1 4 0 0";
var s = @"
0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 4 3 4 3 3
1 0 0 0 0 0 1 4 3 2 2 0 0 0 0 0 0 0 0 0 0 0
1 0 0 0 0 0 0 0 0 2 0 3 2 2 4 0 0 0 0 0 0 0
0 0 3 0 0 0 0 0 0 2 0 3 0 0 0 3 4 3 0 0 0 0
0 4 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 1 2 4 1
0 0 3 0 3 0 1 0 3 0 0 0 0 0 4 3 0 0 0 0 0 0
";
var myList = s.Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries).Select (x => x.Split(new char [] { ' ' }, StringSplitOptions.RemoveEmptyEntries).Select (y => Int32.Parse(y)).ToList()).ToList();
Print(myList, "Before");
int rows = myList.Count;
for (int row = 0; row < rows; row++)
for (int col = 0; col < myList[row].Count; col++)
for (int t3 = 0; t3 < rows; t3++)
if (myList[row][col] != 0 && myList[t3][col] != 0 && myList[row][col] != myList[t3][col])
{
//Print(myList, "Before Step");
for (int uui = 0; uui < rows; uui++)
{
if (uui < t3) // yours: if (uui != t3)
{
// yours: myList[uui].Add(0);
myList[uui].Insert(col + 1, 0);
}
else
{
myList[uui].Insert(col, 0);
}
}
// Print(myList, "After Step");
break;
}
Print(myList, "After");
}
public void Print(List<List<int>> list, string header)
{
Console.WriteLine(header);
Console.WriteLine(ToString(list));
}
public string ToString(List<List<int>> list)
{
return String.Join(Environment.NewLine, list.Select (l => String.Join(" ", l)));
}
关于c# - 删除列表列表中列的冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31230188/