文逸首页 小文论坛 文逸博客 精华文章
 首页 | 新闻 | 论坛 | 博客 | 专题 | FTP | 金融 | 微博 | 图库 | MyHome | 搜索 | 登陆 | 注册 | 帮助 | 设为首页  ·在线人数: 4110
 §您的位置:文逸首页 > chinesedragon 's home > 【理论研究】专栏 > 蛇形方阵
chinesedragon 的主页网址:http://wonyen.net/home.aspx?id=chinesedragon 给我留言

 § chinesedragon  的【理论研究】专栏

  作者:chinesedragon  发表时间: 2005/12/3 13:27:54    查看: 5387     评论: 5
标题: 蛇形方阵

/* 题目
按以下所示规律把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;
}


 

分享到:


 §评论: 蛇形方阵

  回复者:腾讯    回复时间:2011/11/20 18:19:02    [第1评]
QQ抽奖

QQ抽奖活动

腾讯周年挖宝行动是真的吗

腾讯公司有抽奖活动吗

QQ中奖是真的吗

腾讯中奖是真的吗


  回复者:王博    回复时间:2012/7/24 22:17:08    [第2评]
要求大家点击一下查看这些不法分子!
星光大道抽奖活动
星光大道官方网站
星光大道中奖查询网
星光光大道中奖是真的吗
QQ信封


2 条评论;  每页显示 15 条评论;   1 / 1               ↑到页首




您未登陆,发表评论时请填写:用户名 密码 注册新用户  
 评论: 蛇形方阵
内容 (8000字以内)
 (CTRL+ENTER提交) 
  关闭窗口  
用户登陆
我要发表文章
搜 索
§chinesedragon 的网志导航
感想随笔(4)
生活休闲(0)
饮食健康(0)
自然妙趣(1)
潮流时尚(0)
游览见闻(0)
情感绿洲(6)
娱乐搞笑(4)
读图时代(3)
影音视听(4)
商业新知(0)
理论研究(6)
时事纵横(13)
社会文化(15)
文学欣赏(3)
教育学习(15)
§chinesedragon 的友情链接
关于文逸 | 小文论坛 | 文逸博客 | 文逸金融 | 精华文章网站地图 | 联系我们 | 隐私保护
 Copyright© WWW.WONYEN.NET 2003 - 2021  闽ICP备09016518号-16   本站最高 10508 人同时在线,发生时间 2005-5-17 5:09:15 
 文逸科技 制作维护