2017-11-15 6 views
2

私はC言語を学習していますが、この問題の解決策を見つけることはできません。特定の行と列を削除して2D配列のサイズを縮小します

「*」(星印)、「 - 」(水平バー)、「|」(縦棒)、「+」(プラス記号)、およびすべてを削除したいランダムなサイズの行列行には ' - 'があり、すべての列に '|'があり、すべての行と列に '+'があります。

私は残りの '*'(星)を印刷するときに削除された行と列がないように、マトリックスのサイズを減らす方法はありますか?例えば

char mat[3][3] = {{'|', '*', '*'}, 
        {'*', '*', '*'}, 
        {'*', '*', '*'}}; 

は、出力は次のようになります

** 
** 
** 

別の例:

char mat[3][3] = {{'*', '*', '*'}, 
        {'*', '+', '*'}, 
        {'*', '*', '*'}}; 

出力は次のようになります。

大きな行列:

char mat[4][5] = {{'*', '|', '*', '|', '*'}, 
        {'*', '*', '*', '*', '*'}, 
        {'*', '+', '*', '-', '*'} 
        {'*', '*', '*', '*', '-'}}; 

出力は次のようになります。事前に

*** 
*** 

感謝。

答えて

0

静的に定義された配列を例のように縮小することはできません。列や行をマークすることができます。そのため、印刷フェーズが始まると無効化された列と行をスキップするだけです。

#include <stdio.h> 

#define N 3 
#define M 3 

void invalidate_col(char mat[N][M], const int col) 
{ 
    for(int i = 0; i < N; ++i) 
    { 
     mat[i][col] = 'n'; 
    } 
} 

void print(char mat[N][M]) 
{ 
    for(int i = 0; i < N; ++i) 
    { 
     for(int j = 0; j < M; ++j) 
     { 
      if(mat[i][j] != 'n') 
       printf("%c ", mat[i][j]);   
     } 
     printf("\n"); 
    } 
} 

int main(void) { 
    char mat[N][M] = {{'|', '*', '*'}, 
        {'*', '*', '*'}, 
        {'*', '*', '*'}}; 
    for(int i = 0; i < N; ++i) 
    { 
     for(int j = 0; j < M; ++j) 
     { 
      if(mat[i][j] == '|') 
      { 
       invalidate_col(mat, j); 
      } 
     } 
    } 
    print(mat); 
    return 0; 
} 

出力:'|'場合の

* * 
* * 
* * 

あなたは本当に、あなたがする必要がある、これらのカラム(複数可)と行(複数可)を削除する必要がある場合行列を動的に割り当てる(チェックmy example)、それに応じてrealloc()を縮小し、最後にfree()を使用してそのメモリを削除します。

0

かなりシンプルだと思います。

残酷な方法の1つは、入力行列全体をスキャンし、入力行列にある ' - '、 '|'、 '+'に従って除去すべき行と列の数を求めます。 x、yを入力行列の行数と列数とすると、出力行列の行数と列数を推測することができます(x、r、c、2)。

関連する問題