当前位置:  编程技术>c/c++/嵌入式

对一个数组进行zig-zag重新排列

    来源: 互联网  发布时间:2014-10-12

    本文导语:  在看jpeg解码,里面有对8x8数组进行重排。里面直接提供了unzig表: int unzig[] = { 0, 1, 8, 16, 9, 2, 3, 10,17, 24, 32, 25, 18, 11, 4, 5,12, 19, 26, 33, 40, 48, 41, 34,27, 20, 13, 6, 7, 14, 21, 28,35, 42, 49, 56, 57, 50, 43, 36,29, 22, 15, 23, 30, 37, 44, 51,58, 59, 52, 45, 38...

在看jpeg解码,里面有对8x8数组进行重排。里面直接提供了unzig表:

int unzig[] = {

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

};

然后自己写了个产生unzig表的程序。

:-)

 代码如下:

代码如下:

#include
#include
#include

typedef void (*fn)(int, int, int, int, void*);

printpos(int x, int y, int n, int i, void *arr)
{
//    printf("%2d%c", x+y*n, i%n==(n-1)?'n':' ');
    int *a;

    a = (int*)arr;
    printf("%2d%c", a[i], i%n==(n-1)?'n':' ');
}

unzigasgn(int x, int y, int n, int i, void *arr)
{
    int *a;

    a = (int*)arr;
    a[i] = x+y*n;
}

zigasgn(int x, int y, int n, int i, void *arr)
{
    int *a;

    a = (int*)arr;
    a[x+y*n] = i;
}

zigzag(int n, fn f1, void *arr)
{
    int i, x, y;

    i = 0;
    x = y = 0;
    f1(x, y, n, i, arr);
    for(;;) {
        /* right, or down */
        if(++i >= n*n)
            return;
        if(x+1 < n){
            x++;
            f1(x, y, n, i, arr);
        }else{
            y++;
            f1(x, y, n, i, arr);
        }

        /* left down */
        while(x-1 >= 0 && y+1 < n){
            x--;
            y++;
            if(++i >= n*n)
                return;
            f1(x, y, n, i, arr);
        }

        /* down, or right */
        if(++i >= n*n)
            return;
        if(y+1 < n){
            y++;
            f1(x, y, n, i, arr);
        }else{
            x++;
            f1(x, y, n, i, arr);
        }

        /* right up */
        while(x+1 < n && y-1 >= 0){
            x++;
            y--;
            if(++i >= n*n)
                return;
            f1(x, y, n, i, arr);
        }
    }
}

testzigzag(int n)
{
    int i;
    int n2;
    int *arr;

    n2 = n*n;
    arr = malloc(n*n*sizeof(*arr));

    zigzag(n, (fn)zigasgn, arr);
    zigzag(n, (fn)printpos, arr);
    printf("nn");
    zigzag(n, (fn)unzigasgn, arr);
    zigzag(n, (fn)printpos, arr);
}

main(int argc, char **argv)
{
    int n;

    n = 8;
    if(argc > 1){
        n = atoi(argv[1]);
    }
    testzigzag(n);
    return 0;
}

运行结果截图:


    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • C++ Strings(字符串) 成员 data():返回内容的字符数组形式
  • C++指针数组、数组指针、数组名及二维数组技巧汇总
  • C++ Strings(字符串) 成员 copy():将内容复制为一个字符数组
  • c#基础之数组与接口使用示例(遍历数组 二维数组)
  • C++ Strings(字符串) 成员 c_str():将字符串以C字符数组的形式返回
  • 如何将一个数组重新组成一个新的数组?
  • c++类对象数组初始化方式
  • php定义数组和使用示例(php数组的定义方法)
  • php数组函数之array_combine() 数组合并函数
  • 判断php数组维度(php数组长度)的方法
  • php数组函数之array_count_values() 统计数组中所有值出现的次数
  • 请问怎么对一个数组排序,数组的内容是字符串,可能是单个也可能是多个?
  • 在我的java程序中,我从数据库中得到一批数据,不能确定是多少个,我要把它保存到我的java数组中,可是怎样才能向C++中的数组一样可以自由分配空间,在java中我必需预先指定大小,不会一定要用java中的那个可改变数组大小的类吧?
  • 一个String类型的Vector向量数组如何转换成一个String类型数组(请给代码)?
  • php数组函数之array_unique() 去除数组中重复的元素值
  • 将数组中指定数量的元素移动数组后面的实现代码
  • C++中关于[]静态数组和new分配的动态数组的区别分析
  • php判断一个数组是否为另一个数组子集的方法
  • 将二维数组转为一维数组的2种方法
  • 文件描述符集fd_set * readfds;书上这样描述数组元素的每一位对应一个文件描述符,第一个元素代表文件描述符0到31,数组第二个元素代表文
  • 深入理解数组指针与指针数组的区别


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3