<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 195, comments - 34, trackbacks - 0, articles - 1

    生成zigzag序

    Posted on 2010-05-03 17:26 小強摩羯座 閱讀(275) 評論(0)  編輯  收藏
    生成zigzag序,
    1、分析關鍵,在以zigzag序的每一行,以上三角為計算對象分別以i或j的增序排列,因此利用這一點就可以得出結果。
        程序中s即為zigzag行號,而變換則以i和j交替。所以程序很簡單。

     

    #include<iostream>
    #include<iomanip>

    using namespace std;

    #define M 255

    void zigzag(const int N)
    {
        int squa = N * N;
        int a[M][M]={0};
        for (int i = 0;i < N; i++)
        {
            for (int j = 0;j < N;j++)
            {
                int s = i + j;
                if ( s < N)
                {
                     a[i][j] = s * (s+1)/2 + ( (s %2 !=0)?i:j);//注意?:的優先級低于+
                }
                else
                {
                    int sn = (N-1-i) + (N-1-j);
                    a[i][j] = squa - sn * (sn+1)/2 - (N - ( (sn%2 != 0)? i:j));
                }
            }
        }

        for (int i=0; i < N; i++)
        {
            for (int j = 0;j < N;j++)
            {

                cout<<setw(4)<<a[i][j]<<",";
            }
            cout<<endl<<endl;
        }
    }

    int main()
    {
     zigzag(5);
     cout<<endl;
     
     zigzag(8);
     cout<<endl;

        return 0;
    }

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    void zigzag(int n)
    {
    int **a =(int**) malloc(n*sizeof(int *)); //分配空間

    if(NULL == a)
    return ;
    int i;
    for(i = 0; i < n; i++) {
            if((a[i] =(int*) malloc(n * sizeof(int))) == NULL) {
                while(--i>=0)
                    free(a[i]);
                free(a);
                return;
            }
        }

    bool flag = false; //這個標志位用來判斷是從45度角生成還是225度角生成
    int count = 0;
    for(i=0; i<n; i++) //生成的上半部分的數據
    {

    if(flag)
    {
       for(int r = 0; r<=i; r++)
       {
        a[r][i-r] = count;
        count++;
       }
       flag = false;
    }
    else
    {
       for(int r = i; r>=0; r--)
       {
        a[r][i-r] = count;
        count++;
       }
       flag = true;
    }
    }
    for(i=n-1; i>=0; i--) //生成的是下半部分的數據
    {
    // cout<<i<<endl;
    if(flag)
    {
       for(int r = 0; r<=i-1; r++)
       {
        int r1 = n-i+r;       //代表當前行
        int c1 = 2*n-i-1-r1; //代表當前列
        a[r1][c1] = count;
        count++;
       }
       flag = false;
    }
    else
    {
       for(int r = i-1; r>=0; r--)
       {
        cout<<"ddd"<<endl;
        int r1 = n-i+r;
        int c1 = 2*n-i-1-r1;
    //   cout<<r1<<","<<c1<<endl;
        a[r1][c1] = count;
        count++;
       }
       flag = true;
    }
    }
    for(int r = 0; r<n; r++)
    {
    for(int c=0; c<n; c++)
       cout<<a[r][c]<<",";
    cout<<endl;
    }
    }
    int main()
    {
    int n;
    cin>>n;
    zigzag(n);
    return 0;
    }
    網上還有一個人寫了一個比較巧的算法:
    /**
    * 得到如下樣式的二維數組
    * zigzag(jpeg編碼里取象素數據的排列順序)
    *
    *   0, 1, 5, 6,14,15,27,28,
    *   2, 4, 7,13,16,26,29,42,
    *   3, 8,12,17,25,30,41,43,
    *   9,11,18,24,31,40,44,53,
    *   10,19,23,32,39,45,52,54,
    *   20,22,33,38,46,51,55,60,
    *   21,34,37,47,50,56,59,61,
    *   35,36,48,49,57,58,62,63
    */

    #include <stdio.h>
    int main()
    {
        int N;
        int s, i, j;
        int squa;
        scanf("%d", &N);
        /* 分配空間 */
        int **a = malloc(N * sizeof(int *));
        if(a == NULL)
            return 0;
        for(i = 0; i < N; i++) {
            if((a[i] = malloc(N * sizeof(int))) == NULL) {
                while(--i>=0)
                    free(a[i]);
                free(a);
                return 0;
            }
        }
        /* 數組賦值 */
        squa = N*N;   
        for(i = 0; i < N; i++)
            for(j = 0; j < N; j++) {
                s = i + j;
                if(s < N)
                    a[i][j] = s*(s+1)/2 + (((i+j)%2 == 0)? i : j);
                else {
                    s = (N-1-i) + (N-1-j);
                    a[i][j] = squa - s*(s+1)/2 - (N - (((i+j)%2 == 0)? i : j));
                }
            }
        /* 打印輸出 */   
        for(i = 0; i < N; i++) {
            for(j = 0; j < N; j++)
                printf("%-6d", a[i][j]);
            printf("\n");
        }
        return 0;
    }




    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 最近新韩国日本免费观看| 精品在线免费视频| 亚洲国产精品免费在线观看| 亚洲精品无码专区久久久| 国产成人1024精品免费| 亚洲无线观看国产精品| 中文字幕免费在线看电影大全 | 综合自拍亚洲综合图不卡区| 欧洲人免费视频网站在线| 国产亚洲成AV人片在线观黄桃| 精品视频在线免费观看| 亚洲AV无码专区国产乱码4SE| 亚洲精品免费在线观看| 亚洲精品**中文毛片| 黄页网站免费在线观看| 亚洲va中文字幕| 亚洲AV伊人久久青青草原| 拍拍拍无挡视频免费观看1000| 亚洲不卡中文字幕无码| 亚洲视频免费播放| 精品久久亚洲中文无码| 国产三级免费电影| 国产一级在线免费观看| 亚洲精品在线播放| 国产色爽免费视频| 中文精品人人永久免费| 亚洲国产精品一区二区久| 日本v片免费一区二区三区| 一级做a爰片性色毛片免费网站| 亚洲国产精品无码久久久不卡| 国内精品免费麻豆网站91麻豆| 亚洲乱码av中文一区二区| 亚洲女同成人AⅤ人片在线观看| 久9热免费精品视频在线观看| 亚洲a视频在线观看| 亚洲精品国产自在久久| 成人免费激情视频| 免费人成视频在线播放| 亚洲系列中文字幕| 无码不卡亚洲成?人片| 18未年禁止免费观看|