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

 更新时间:2013年03月06日 09:55:45   作者:  
本文介绍了“对一个数组进行zig-zag重新排列”,需要的朋友可以参考一下

在看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 <stdio.h>
#include <string.h>
#include <stdlib.h>

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("\n\n");
    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;
}

运行结果截图:

相关文章

  • C语言单链表常见操作汇总

    C语言单链表常见操作汇总

    这篇文章主要介绍了C语言单链表常见操作,需要的朋友可以参考下
    2014-07-07
  • C语言实现输出各种三角形

    C语言实现输出各种三角形

    这篇文章主要介绍了C语言实现输出各种三角形方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-12-12
  • C语言结构体占用内存深入讲解

    C语言结构体占用内存深入讲解

    这篇文章主要给大家介绍了关于C语言结构体占用内存的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • C/C++读写文本文件、二进制文件的方法

    C/C++读写文本文件、二进制文件的方法

    今天小编就为大家分享一篇C/C++读写文本文件、二进制文件的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-07-07
  • Qt中线程常用通信方式介绍

    Qt中线程常用通信方式介绍

    Qt中,线程通信无处不在,最核心的特性信号槽就是一种线程间通信,这篇文章主要为大家介绍了几种常用的方式,需要的小伙伴可以参考一下
    2025-01-01
  • Qt简单实现密码器控件

    Qt简单实现密码器控件

    这篇文章主要为大家详细介绍了Qt简单实现密码器控件,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-06-06
  • C++中关于委派(Delegates)的实现示例

    C++中关于委派(Delegates)的实现示例

    这篇文章主要介绍了C++中关于委派(Delegates)的实现示例,针对C++11的一些新特性进行讲解,需要的朋友可以参考下
    2015-07-07
  • C语言break和continue的语句用法

    C语言break和continue的语句用法

    这篇文章主要介绍了C语言break和continue的语句用法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-04-04
  • C语言实现猜数游戏

    C语言实现猜数游戏

    这篇文章主要为大家详细介绍了C语言实现猜数游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-12-12
  • C++设计模式之适配器模式

    C++设计模式之适配器模式

    这篇文章主要介绍了C++设计模式之适配器模式,本文详细讲解了C++中的适配器模式,并给出了实现代码,需要的朋友可以参考下
    2014-09-09

最新评论