2017-10-19 10 views
1

再帰を使用して画像圧縮で使用されるアルゴリズムを模倣する簡単な基本プログラムを完成しようとしています。 私はn×nの行列を持ちます。ここで、nは常に2のべき乗です。これは、4 n/2 * n/2の他の行列で行列を分割できるからです。 二つの基地場合があります再帰C画像圧縮アルゴリズム

  • 行列が1x1のはちょうどその位置内の値を返しています。我々は0印刷その場合異なるvalues.Inを有する場合
  • のn×nブロック内のすべての値は、次に、Xが共通の値になる1Xを、同じ印刷さ

再帰的な場合であると我々は、マトリックスを分割します他の4つのn/2×n/2行列である。

これらの領域は、左上の領域を起点としてクロック順に再帰的に処理されます。

例:

8 
..**.... 
..**.... 
**...... 
**...... 
........ 
........ 
......*. 
......*. 

回答:001.1 * 1.1 * 1.01.1.0 * .. * 1.1。

私の問題は、私のコードでケースが見つからないため、私の答えが実際に期待される結果と完全には一致しないということです。再帰の

void computeComressor(char** arr,int m,int x,int y){ 
    int i,j; 
    int flag=1; 
    char c=arr[x][y]; 
    if(m==1){ 
     printf("%c",c); 
     return; 
    } 
    for(i=x;i<m-x*y;i++){ 
     for(j=y;j<m-x*y;j++){ 
      if(arr[i][j]==c){ 
       continue; 
      } 
      else{ 
       flag=0; 
       break; 
      } 
     } 
    } 

    if(flag==1){ 
     printf("1%c",c); 
    } 
    else{ 
     printf("0"); 
     computeComressor(arr,m/2,x,y); 
     computeComressor(arr,m/2,x,m/2); 
     computeComressor(arr,m/2,m/2,m/2); 
     computeComressor(arr,m/2,m/2,y); 
    } 
} 

答えて

1

あなたcomputeCompressor()引数が間違っているようだ:

は、ここに私のコードです。 xまたはy引数にm/2を渡すと、サブ行列の左上隅に対応しない再帰レベルに基づいて4,2,1になります。現在のサブマトリックスのxyの値をm/2に追加する必要があります。しかし、その場合でも、あなたのコードはサブマトリクスを反時計回りの順序で移動します。ここで

私はいくつかの余分な変更でcomputeCompressor()のために提案する修正です:すべてのケースは私だけ1を与えたとして

void computeComressor(char** arr, int m, int x, int y){ 
    int  i,j; 
    char c = arr[x][y]; 
    int  hm = m/2; 

    if (m==1) { 
     printf("%c", c); 
     return; 
    } 

    for (i=x; i<x+m; i++) { 
     for (j=y; j<y+m; j++) { 
      if (arr[i][j] != c) { 
       printf("1%c", c); 
       return; 
      } 
     } 
    } 

    printf("0"); 
    computeComressor(arr, hm, x + 0, y + 0); 
    computeComressor(arr, hm, x + hm, y + 0); 
    computeComressor(arr, hm, x + hm, y + hm); 
    computeComressor(arr, hm, x + 0, y + hm); 
} 
+0

は本当にあなたの方法を働いていないが、私はから実際に間違っていたところ私が発見しましたあなたの説明。停止条件m-x * yは私の間違いでした(再帰を使用しているときにm/2を追加していなかったのですが、あなたの答えにそのことを明示する前に解決していました)。 –

+0

私は実際にそれをテストしていませんが、それが助けて良かったです。 –