我尝试实现某些算法,应该使用什么算法,什么是4维
但是我在向新列表中添加元素时遇到了问题:当我在列表中添加新值时:temp2,其他列表中的先前值正在改变
任何人都可以告诉我我做错的地方和地点吗?
示例:
对于n = 4,k = 2:
当i = 3时,j = 1
- > tab [3,1] = [{1},{2},{3}](它应该总是这样)
然后当i = 3时,j = 2 tab [3,1]正在改变:
- > tab [3,1]:[{1,3},{2,3},{3}]
然后当i = 4时,j = 1
- > tab [4,1] = [{1,3},{2,3},{3},{4}]
然后当i = 4时,j = 2 tab [4,1]正在改变:
- > tab [4,1]:[{1,3,4},{2,3,4},{3,4},{4}]
我在程序中的算法代码
while (true)
{
int n = int.Parse(Console.ReadLine());
int k = int.Parse(Console.ReadLine());
List<List<int>>[,] tab = new List<List<int>>[n + 1, k + 1];
for (int i = 1; i <= n; i++)
{
int j = 0;
while (j <= i && j <= k)
{
tab[i, j] = new List<List<int>>();
List<int> toAdd = new List<int>();
if (j == 0)
{
toAdd.Clear(); //add empty
tab[i, 0].Add(toAdd);
}
else if (i == j)
{
for (int p = 1; p <= j; p++)
toAdd.Add(p);
tab[i, i].Add(toAdd);
}
else
{
var temp = new List<List<int>>();
var temp2 = new List<List<int>>();
temp.AddRange(tab[i - 1, j]);
temp2.AddRange(tab[i - 1, j - 1]);
foreach (var x in temp2) //add 'i' as last element for each element of temp2
x.Add(i); //here is sth wrong (bad reference?)
temp2.Reverse(); //reverse order
tab[i, j].AddRange(temp);
tab[i, j].AddRange(temp2);
}
j++;
}
}
//show tab[n,k] in console
}
为什么我使用这些简单的变量 - 我在我的类中实现算法,所以我必须使用它们。
答案 0 :(得分:0)
当您致电temp2.AddRange(tab[i - 1, j - 1])
时,您会将对[i - 1, j - 1]
列表的引用复制。因此,当您修改temp2
时,您也会修改原始列表(它们是同一个对象)。
您需要为内部列表创建新列表:
temp.AddRange(tab[i - 1, j].Select(l => new List<int>(l)));
temp2.AddRange(tab[i - 1, j - 1]).Select(l => new List<int>(l)));