zoukankan      html  css  js  c++  java
  • 蛇形方阵 Anthony

    /* 题目
    按以下所示规律把1-N*N个数填入N*N的方阵中:
      1   3   4  10  11
      2   5   9  12  19
      6   8  13  18  20
      7  14  17  21  24
     15  16  22  23  25
    */

    #include <stdio.h>
    #include <assert.h>
    #include <string.h>
    /*
    解析:
     上三角形
     a(0)=   1     = 1    + 0
     a(1)=  2 3    = a(0) + 1, a(0) + 1 + 1
     a(2)= 4 5 6   = a(1) + 2, a(1) + 2 + 1, a(1) + 2 + 2
     a(3)=7 8 9 10 = a(2) + 3, a(2) + 3 + 2, a(2) + 3 + 2, a(2) + 3 + 3
     ...
     a(n)= sum_n(n), sum_n(n) + 1, sum_n(n) + 2, ..., sum_n(n) + n
     反转序列为
     a(n)= sum_n(n), sum_n(n) + n - 1, sum_n(n) + n - 2, ..., sum_n(n) + n - 3
     
     bn数组中
     bn(0, 0) = a(0)(0)
     bn(0, 1) = a(1)(1)
     bn(0, 2) = a(2)(2)

     bn(1, 0) = a(1)(0)
     bn(1, 1) = a(2)(1)

     下三角形,与上三角形对称
     bn(n, n) = max - bn(0, 0);
     bn(n - 1, n) = max - bn(1, 0);
     bn(n , n - 1) = max - bn(0, 1);
    */

    int sum_n(int n)
    {
        return 1 + (n * (n + 1))/ 2;
    }

    int rev(int n, int m)
    {
        return ((m + n) & 0x1) ? m : n;
    }

    int bn(int n, int m)
    {
        return sum_n(n + m) + rev(m, n);
    }

    void snake_array(int *p, int m)
    {
        int max_v = m * m + 1;
        for(int i = 0; i < m; ++i)
        {
            for (int j = 0; j < m - i ; ++j)
            {
                int value = bn(j, i);
                (p + i * m)[j] = value;
                (p + (m - i - 1) * m)[m - j - 1] = max_v - value;
            }
        }
    }

    void test()
    {
        int correct[25] =
        {
            1,  3,  4, 10, 11,
            2,  5,  9, 12, 19,
            6,  8, 13, 18, 20,
            7, 14, 17, 21, 24,
            15,16, 22, 23, 25
        };

        int test[25] = {0};
        snake_array(test, 5);
        assert(0 == memcmp(test, correct, sizeof(correct)));

    }
    void print_square(int *p, int m)
    {
        for(int i = 0; i < m; ++i)
        {
            for(int j = 0; j < m; ++j)
            {
                printf("%3d ", (p + i * m)[j]);
            }
            puts("");
        }
    }

    int main(int argc, char *argv[])
    {
        test();

        static const int N = 5;
        int array[N * N] = {0};
        snake_array(array, N);
        print_square(array, N);
     return 0;
    }

  • 相关阅读:
    jquery_ajax 地址三级联动
    delphi窗体按钮灰化禁用
    sqlserver查找断号,回收单据号
    query.locate过个过滤参数
    StringGrid换行功能
    你不知道的JavaScript--Item13 理解 prototype, getPrototypeOf 和__proto__
    你不知道的JavaScript--Item12 undefined 与 null
    你不知道的JavaScript--Item11 arguments对象
    你不知道的JavaScript--Item10 闭包(closure)
    你不知道的JavaScript--Item9 call(),apply(),bind()与回调
  • 原文地址:https://www.cnblogs.com/ahuangliang/p/5309268.html
Copyright © 2011-2022 走看看