二维数组中长度为 8 的所有可能组合
我一直在尝试组合解决问题。我有一个 6X6 矩阵,我试图找到矩阵中长度为 8 的所有组合。
我必须从每行、列的位置从一个邻居移动到另一个邻居,我编写了一个递归程序来生成组合,但问题是它也会生成大量重复项,因此效率低下。我想知道如何消除重复计算并节省时间。
int a={{1,2,3,4,5,6},
{8,9,1,2,3,4},
{5,6,7,8,9,1},
{2,3,4,5,6,7},
{8,9,1,2,3,4},
{5,6,7,8,9,1},
}
void genSeq(int row,int col,int length,int combi)
{
if(length==8)
{
printf("%d\n",combi);
return;
}
combi = (combi * 10) + a[row][col];
if((row-1)>=0)
genSeq(row-1,col,length+1,combi);
if((col-1)>=0)
genSeq(row,col-1,length+1,combi);
if((row+1)<6)
genSeq(row+1,col,length+1,combi);
if((col+1)<6)
genSeq(row,col+1,length+1,combi);
if((row+1)<6&&(col+1)<6)
genSeq(row+1,col+1,length+1,combi);
if((row-1)>=0&&(col+1)<6)
genSeq(row-1,col+1,length+1,combi);
if((row+1)<6&&(row-1)>=0)
genSeq(row+1,col-1,length+1,combi);
if((row-1)>=0&&(col-1)>=0)
genSeq(row-1,col-1,length+1,combi);
}
我还考虑编写一个动态程序,基本上是带有记忆的递归程序。这是更好的选择吗?如果是的话,我不清楚如何在递归中实现它。我的方法真的走进了死胡同吗???
谢谢
编辑 例如结果 12121212,12121218,12121219,12121211,12121213。
限制是你必须从任何一点移动到你的邻居,你必须从矩阵中的每个位置开始,即每行,每列。您可以一次移动一步,即右、左、上、下以及两个对角线位置。检查 if 条件。 IE 如果你在(0,0),你可以移动到(1,0)或(1,1)或(0,1),即三个邻居。 如果你在(2,2),你可以移动到八个邻居。
很快...
I've been trying to solve a problem in combinations. I have a matrix 6X6 i'm trying to find all combinations of length 8 in the matrix.
I have to move from neighbor to neighbor form each row,column position and i wrote a recursive program which generates the combination but the problem is it generates a lot of duplicates as well and hence is inefficient. I would like to know how could i eliminate calculating duplicates and save time.
int a={{1,2,3,4,5,6},
{8,9,1,2,3,4},
{5,6,7,8,9,1},
{2,3,4,5,6,7},
{8,9,1,2,3,4},
{5,6,7,8,9,1},
}
void genSeq(int row,int col,int length,int combi)
{
if(length==8)
{
printf("%d\n",combi);
return;
}
combi = (combi * 10) + a[row][col];
if((row-1)>=0)
genSeq(row-1,col,length+1,combi);
if((col-1)>=0)
genSeq(row,col-1,length+1,combi);
if((row+1)<6)
genSeq(row+1,col,length+1,combi);
if((col+1)<6)
genSeq(row,col+1,length+1,combi);
if((row+1)<6&&(col+1)<6)
genSeq(row+1,col+1,length+1,combi);
if((row-1)>=0&&(col+1)<6)
genSeq(row-1,col+1,length+1,combi);
if((row+1)<6&&(row-1)>=0)
genSeq(row+1,col-1,length+1,combi);
if((row-1)>=0&&(col-1)>=0)
genSeq(row-1,col-1,length+1,combi);
}
I was also thinking of writing a dynamic program basically recursion with memorization. Is it a better choice?? if yes than I'm not clear how to implement it in recursion. Have i really hit a dead end with approach???
Thankyou
Edit
Eg result
12121212,12121218,12121219,12121211,12121213.
the restrictions are that you have to move to your neighbor from any point, you have to start for each position in the matrix i.e each row,col. you can move one step at a time, i.e right, left, up, down and the both diagonal positions. Check the if conditions.
i.e
if your in (0,0) you can move to either (1,0) or (1,1) or (0,1) i.e three neighbors.
if your in (2,2) you can move to eight neighbors.
so on...
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
您可以将您的矩阵视为一维数组 - 无论这里如何(将行一一“放置”)。对于一维数组,您可以编写一个类似的函数(假设您应该打印组合)
它应该跳过从 a[i] 到 a[i + k] 的一些元素(对于所有可能的 k),打印 a[k] 并制作递归调用 f(i + k + 1, n - 1)。
You can think about your matrix like it is one-dimension array - no matter here ("place" the rows one by one). For one-dimension array you can write a function like (assuming you should print the combinations)
It should skip some elements from a[i] to a[i + k] (for all possible k), print a[k] and make a recursive call f(i + k + 1, n - 1).
为了消除重复,您可以将 8 位数字序列转换为 8 位数字整数,并将它们放入哈希表中。
记忆可能是个好主意。您可以为矩阵中的每个单元格记住可以从中实现的长度 2-7 的所有可能组合。向后退:首先为每个单元格生成所有 2 位数字的序列。然后基于 3 位数字等
更新:Python 中的代码
To eliminate duplicates you can covert 8 digit sequences into 8-digit integers and put them in a hashtable.
Memoization might be a good idea. You can memoize for each cell in the matrix all possible combinations of length 2-7 that can be achieved from it. Going backwards: first generate for each cell all sequences of 2 digits. Then based on that of 3 digits etc.
UPDATE: code in Python
有很多方法可以做到这一点。仔细检查每种组合是完全合理的第一种方法。这一切都取决于您的要求。如果您的矩阵很小,并且此操作对时间不敏感,那么就没有问题。
我并不是一个真正的算法专家,但我确信有人会在我之后发布一些非常聪明的方法来做到这一点。
另外,
在 Java 中使用 CamelCase 时,方法名称应以小写字符开头。There are LOTS of ways to do this. Going through every combination is a perfectly reasonable first approach. It all depends on your requirements. If your matrix is small, and this operation isn't time sensitive, then there's no problem.
I'm not really an algorithms guy, but I'm sure there are really clever ways of doing this that someone will post after me.
Also,
in Javawhen using CamelCase, method names should start with a lowercase character.int a={{1,2,3,4,5,6},
{8,9,1,2,3,4},
{5,6,7,8,9,1},
{2,3,4,5,6,7},
{8,9,1,2,3,4},
{5,6,7,8,9,1},
}
所谓长度,是指矩阵元素组合所得 8 的总和。
即,将 8 与行本身以及其他行元素相加的元素。
从第 1 行 = { {2,6}, {3,5}, } 到现在第 1 行元素和第 2 行元素,依此类推。这就是你所期待的吗?
int a={{1,2,3,4,5,6},
{8,9,1,2,3,4},
{5,6,7,8,9,1},
{2,3,4,5,6,7},
{8,9,1,2,3,4},
{5,6,7,8,9,1},
}
By length you mean summation of combination of matrix elements resulting 8.
i.e., elements to sum up 8 with in row itself and with the other row elements.
From row 1 = { {2,6}, {3,5}, } and now row 1 elements with row 2 and so on. Is that what you are expecting ?