通过C中矩阵的每个单元格进行递归枚举
我想用所有可能的组合填充一个3x3矩阵,其中每个单元格可以取0、1或2。我还想打印不同组合的矩阵。因此,代码应该打印3^9=19683个不同的矩阵。 例如,我想打印通过C中矩阵的每个单元格进行递归枚举,c,recursion,matrix,C,Recursion,Matrix,我想用所有可能的组合填充一个3x3矩阵,其中每个单元格可以取0、1或2。我还想打印不同组合的矩阵。因此,代码应该打印3^9=19683个不同的矩阵。 例如,我想打印 0 1 2 0 0 1 2 0 1 等等 以下是我尝试过的: #include <stdio.h> int mat[3][3]; int row, col; int matrixfill(int row, int col) { int i, k, l; for (i = 0;
0 1 2
0 0 1
2 0 1
等等 以下是我尝试过的:
#include <stdio.h>
int mat[3][3];
int row, col;
int matrixfill(int row, int col) {
int i, k, l;
for (i = 0; i < 3; i++) {
mat[row][col] = i;
if (row < 2 && col < 2) {
col++;
matrixfill(row, col);
} else
if (row < 2 && col == 2) {
col = 0;
row++;
matrixfill(row, col);
} else
if (row == 2 && col < 2) {
col++;
matrixfill(row, col);
} else {
for (k = 0; k < 3; k++) {
for (l = 0; l < 3; l++) {
printf("%d ", mat[k][l]);
}
printf("\n");
}
printf("\n---------------\n");
}
}
}
int main() {
matrixfill(0,0);
}
但我希望看到最后一个矩阵
2 2 2
2 2 2
2 2 2
我做错了什么?您的解决方案不起作用,因为您在循环中修改了
行
和列
。在下一个单元格上递归之前,您不会测试单元格mat[row][col]
的所有可能性
您可以通过以下方式创建简单的递归解决方案:
#include <stdio.h>
int mat[3][3];
void matrixfill(int n) {
int col, row, i;
if (n == 9) {
// print the matrix
for (row = 0; row < 3; row++) {
for (col = 0; col < 3; col++) {
printf("%d ", mat[row][col]);
}
printf("\n");
}
printf("\n---------------\n");
} else {
// enumerate all possible contents for cell n and recurse
row = n / 3;
col = n % 3;
for (i = 0; i < 3; i++) {
mat[row][col] = i;
matrixfill(n + 1);
}
}
}
int main(void) {
matrixfill(0);
return 0;
}
#包括
int mat[3][3];
无效矩阵填充(整数n){
int col,row,i;
如果(n==9){
//打印矩阵
用于(行=0;行<3;行++){
用于(列=0;列<3;列++){
printf(“%d”,mat[行][col]);
}
printf(“\n”);
}
printf(“\n--------------\n”);
}否则{
//枚举单元格n的所有可能内容并递归
row=n/3;
col=n%3;
对于(i=0;i<3;i++){
mat[行][col]=i;
矩阵填充(n+1);
}
}
}
内部主(空){
matrixfill(0);
返回0;
}
第一个和第二个矩阵应该是什么?您的示例需要使用rand()
?我不关心第一个和最后一个矩阵。我只想打印所有可能的矩阵组合,其中每个单元格可以从0到2。在这个例子中,我展示了两个这样的矩阵,不一定是第一个和第二个。根据我的代码,我希望看到的最后一个矩阵,但也不一定是那个矩阵。它真的必须通过递归(重堆栈)来解决,还是一对嵌套循环就可以了?毕竟,递归函数只有一个循环。我知道使用嵌套循环会更容易,但我正在寻找一个递归解决方案。
2 2 2
2 2 2
2 2 2
#include <stdio.h>
int mat[3][3];
void matrixfill(int n) {
int col, row, i;
if (n == 9) {
// print the matrix
for (row = 0; row < 3; row++) {
for (col = 0; col < 3; col++) {
printf("%d ", mat[row][col]);
}
printf("\n");
}
printf("\n---------------\n");
} else {
// enumerate all possible contents for cell n and recurse
row = n / 3;
col = n % 3;
for (i = 0; i < 3; i++) {
mat[row][col] = i;
matrixfill(n + 1);
}
}
}
int main(void) {
matrixfill(0);
return 0;
}