2015-11-08 75 views
1

请帮我找到并打印方阵的所有平方子矩阵由大变小方阵C编程语言如何在C中打印方阵的所有正方形子矩阵?

我写代码,工程错误:

int main() { 
    int mtrx_size = 8; 
    int mat[8][8] = { 
     { 1, 2, 3, 4, 5, 6, 7, 8}, 
     { 9,10,11,12,13,14,15,16}, 
     {17,18,19,20,21,22,23,24}, 
     {25,26,27,28,29,30,31,32}, 
     {33,34,35,36,37,38,39,40}, 
     {41,42,43,44,45,46,47,48}, 
     {49,50,51,52,53,54,55,56}, 
     {57,58,59,60,61,62,63,64} 
    }; 

    int i,j; 
    int sub_mtrx_size; 

    for(sub_mtrx_size = mtrx_size; sub_mtrx_size > 1 ; sub_mtrx_size--) 
    { 
     for(i = 0; i < sub_mtrx_size; i++) 
     { 
      for(j = 0; j < sub_mtrx_size; j++) 
      { 
       printf("%3d ", mat[i][j]); 
      } 
      printf("\n"); 
     } 
     printf("\n"); 

    } 
    return 0; 

在这里,我需要找到所有8x8,7x7,6x6,5x5,4x4,3x3和2x2子矩阵。

+0

此代码只打印第一的7x7,6x6的,.. 2x2矩阵。但我需要所有子矩阵 –

回答

2

您的代码只是为每个大小打印一个单独的子矩阵,位于矩阵的左上角。您需要添加i和j偏移在所有位置以获得子矩阵:

#include <stdio.h> 

int main() { 
    int mtrx_size = 8; 
    int mat[8][8] = { 
     { 1, 2, 3, 4, 5, 6, 7, 8}, 
     { 9,10,11,12,13,14,15,16}, 
     {17,18,19,20,21,22,23,24}, 
     {25,26,27,28,29,30,31,32}, 
     {33,34,35,36,37,38,39,40}, 
     {41,42,43,44,45,46,47,48}, 
     {49,50,51,52,53,54,55,56}, 
     {57,58,59,60,61,62,63,64} 
    }; 

    int i, j, ioff, joff, off_cnt; 
    int sub_mtrx_size; 

    for(sub_mtrx_size = mtrx_size; sub_mtrx_size > 1 ; sub_mtrx_size--) { 
     off_cnt = mtrx_size - sub_mtrx_size + 1; 
     for (ioff = 0; ioff < off_cnt; ioff++) { 
      for (joff = 0; joff < off_cnt; joff++) { 
       for (i = 0; i < sub_mtrx_size; i++) { 
        for (j = 0; j < sub_mtrx_size; j++) { 
         printf("%3d ", mat[i+ioff][j+joff]); 
        } 
        printf("\n"); 
       } 
       printf("\n"); 
      } 
     } 
    } 

    return 0; 
} 
+0

哇,这是有效的,谢谢。我们可以从2x2做到更大吗? –

+1

您的意思是更改顺序来打印较小的第一个?当然,只需将外层'sub_mtrx_size'循环从'2'开始并在<<= mtrx_size'时继续,而不是向下递增。 –

+0

谢谢。你救了我。现在我明白了。 –

0

对于一般的n×m矩阵Java实现:

private static void printSubMatrix(int[][] mat) { 
    int rows=mat.length; 
    int cols=mat[0].length; 

    //prints all submatrix greater than or equal to 2x2 
    for (int subRow = rows; subRow >= 2; subRow--) { 
     int rowLimit = rows - subRow + 1; 
     for (int subCol = cols; subCol >= 2; subCol--) { 
      int colLimit = cols - subCol + 1; 
      for (int startRow = 0; startRow < rowLimit; startRow++) { 
       for (int startCol = 0; startCol < colLimit; startCol++) { 

        for (int i = 0; i < subRow; i++) { 
         for (int j = 0; j < subCol; j++) { 
          System.out.print(mat[i + startRow][j + startCol] + " "); 
         } 
         System.out.print("\n"); 
        } 
        System.out.print("\n"); 

       } 
      } 
     } 
    } 

}