通过C中矩阵的每个单元格进行递归枚举

通过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;

我想用所有可能的组合填充一个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; 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;
}