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

2016-02-19 11:00 62 1 收藏

图老师小编精心整理的对一个数组进行zig-zag重新排列希望大家喜欢,觉得好的亲们记得收藏起来哦!您的支持就是小编更新的动力~

【 tulaoshi.com - 编程语言 】

在看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,

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

};

然后自己写了个产生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);
        }
    }
}

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

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

运行结果截图:

来源:http://www.tulaoshi.com/n/20160219/1596327.html

延伸阅读
标签: Web开发
Javascript的字符串有个indexOf的方法,能够返回字符在指定的字符串中的位置,非常有用,本文介绍了如何给Javascript数组也添加一个类似的方法。 script type="text/javascript"//![CDATA[[].indexOf || (Array.prototype.indexOf = function(v){for(var i = this.length; i-- && this[i] !== v;);return i;});var b =...
给出一个数,判断这个数是不是素数: 代码如下: #include cmath bool isPrime(int n) {   int i;   for (i = 2; i = sqrt(n); i++) {     if (n % i == 0)       return false;   }   return true; }
本例演示了怎样通过API的调用向一个IP地址发送一个包的数据并等待回音。 新建一个工程,添加一个标准模块,写入以下代码: OptionExplicit PublicConstIP_STATUS_BASE=11000 PublicConstIP_SUCCESS=0 PublicConstIP_BUF_TOO_SMALL=(11000 1) PublicConstIP_DEST_NET_UNREACHABLE=(11000 2) PublicConstIP...
标签: 电脑入门
目前QQ群添加在本地电脑上面是没有个数限制的,但是只支持在客户端上面漫游显示500个QQ群,若您添加的QQ群超过500个,更换电脑登录后也只能拉取最近过联系的500个群。但是如果其他未显示的群有新消息,那么还是可以接收的。
标签: Web开发
代码如下: SCRIPT LANGUAGE="JavaScript" !-- var test = ["aa","bb","cc","dd","ee"]; document.write(test[Math.floor(Math.random()*test.length)]); setInterval("location.reload()",1000); //-- /SCRIPT 这是个奇妙的方法。适合做标题性质文字的随机轮换显示。 有两种不同的方式实现: 一、随机取单个,二、让整个数组随机...

经验教程

245

收藏

74
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部