2015-11-08 3 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', увеличиваясь вместо down. –

+0

Спасибо. Вы спасли меня. Теперь я понимаю это. –

0

реализацию Java для матрицы общего NXM:

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"); 

       } 
      } 
     } 
    } 

}