【发布时间】:2011-05-30 03:11:48
【问题描述】:
我一直在尝试以组合方式解决问题。我有一个 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.
限制是您必须从任何点移动到您的邻居,您必须从矩阵中的每个位置开始,即每一行,col。您可以一次移动一步,即右、左、上、下和两个对角线位置。检查 if 条件。
IE
如果您在 (0,0) 中,您可以移动到 (1,0) 或 (1,1) 或 (0,1) ,即三个邻居。
如果您在 (2,2) 中,您可以搬到八个邻居。
等等……
【问题讨论】:
-
你怎么称呼这个,你有样本输出吗?当您说长度 8 时,是否有任何限制(方向)适用 - 或者它是来自任何位置的任何方向?
-
限制是你必须从任何一点移动到你的邻居,你必须从矩阵中的每个位置开始,即每一行,col。您可以一次移动一步,即右、左、上、下和两个对角线位置。检查 if 条件。
标签: c++ c recursion combinations