【发布时间】:2014-12-29 22:52:04
【问题描述】:
我需要这个练习的帮助:
给出在输入中接收整数 n 并打印所有可能的矩阵 nxn 的伪代码,其中 a 的数量大于或等于 b 的数量,例如 n=2:(顺序不重要)
输出:
aa aa aa ab ab ba
咩咩咩咩咩咩咩咩
该算法的复杂度为 O($n^2*S(n)$)。其中 S(n) 是应打印的矩阵数。
现在我对回溯的技术算法不是很了解,因为我正在研究它......所以请如果有人可以帮助我进行练习和回溯......否则我永远不会通过这个考试。 谢谢你们;)
exercise(char[][] M,int i,int j,int[] arrRB,int[] arrCB, int n , int nelem )
{
if(nelem == n*n)
{
for (int r=0 ; r<n ; r++)
{
for(int c=0 ; c<n ;c++)
System.out.print(M[r][c]);
System.out.print("\n");
}
System.out.print("\n");
}
else
{
if(i<n && j<n)
{
int r=i,c=j;
if (arrRB[i] <= n-(i+1) && arrCB[j] <= n-(j+1))
{
M[i][j] = 'b';
arrRB[i]++;
arrCB[j]++;
exercise(M,i,j+1,arrRB ,arrCB ,n,nelem+1);
exercise(M,i+1,j,arrRB ,arrCB ,n,nelem+1 );
arrRB[r]--;
arrCB[c]--;
}
M[r][c] = 'a';
exercise(M,r+1,c,arrRB ,arrCB ,n, nelem+1);
exercise(M,r,c+1,arrRB ,arrCB ,n,nelem+1 );
}
}
}
}
【问题讨论】:
-
我想我必须在 M[i,j] 中放一个 'b',如果在行 'i' 和列 'j' 中,'b' 的数量是小于余数 (n-(i+1)) 和 (n-(j+1)) 。其中 n 是大小 i,j 索引。我使用两个数组来记住每行和每列的 b 的数量,因此例如 arrayBrow[i] 包含在行“i”中。但我的问题是使用递归管理索引。
-
您实际上可以在每行内按行和列的顺序填充矩阵。类似于:将 a 或 b 放入 (i, j) 单元格,然后递归填充 (i, j + 1) 或 (i + 1, 0) 单元格(取决于 i 行是否结束)。
-
对不起,我怎样才能在评论中插入代码?因为我想向你展示我的代码。
-
为什么不将它添加到您的问题中?
-
好的...我已经添加了它;)
标签: algorithm recursion recursive-backtracking