【问题标题】:Recursion C image compressor algorithm递归 C 图像压缩算法
【发布时间】:2017-10-19 07:13:32
【问题描述】:

我正在尝试完成一个简单的基本程序,该程序模仿用于使用递归进行图像压缩的算法。 我有一个 n x n 矩阵,其中 n 始终是 2 的幂。这是因为我们可以将矩阵拆分为 4 n/2 * n/2 其他矩阵。 有两种基本情况:

  • 当矩阵为 1x1 时,只需返回该位置内的值。
  • 当 n x n 块内的所有值都相等时,打印 1x,其中 x 是公共值

递归情况是当我们有不同的值时。在这种情况下,我们打印 0 并将矩阵划分为其他四个 n/2 x 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);
    }
}

【问题讨论】:

    标签: c algorithm recursion


    【解决方案1】:

    您关于递归的computeCompressor() 参数似乎是错误的。如果您为 x 或 y 参数传递 m/2,它将基于与子矩阵的左上角不对应的递归级别产生 4、2 和 1。您必须将当前子矩阵的xy 值添加到m/2。但即使在这种情况下,您的代码也会以逆时针顺序遍历子矩阵。

    这是我为 computeCompressor() 提出的修复建议,只做了一些额外的修改:

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

    【讨论】:

    • 并没有真正按照你的方式工作,因为每个案例只给了我 1. ,但我从你的描述中发现了我实际上错在哪里。停止条件 m-x*y 是我的错误(除了我在使用递归时没有添加 m/2 而是在你在答案中指出之前我已经解决了)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-19
    相关资源
    最近更新 更多