| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3372 人关注过本帖
标题:螺旋方阵
只看楼主 加入收藏
虾饺
Rank: 1
等 级:新手上路
帖 子:14
专家分:0
注 册:2017-2-27
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:11 
螺旋方阵
下面是一个5阶的螺旋方阵。编写程序打印此形式的n(n<10)阶的方阵。
(顺时针方向旋进)
        1   2   3   4   5
       16  17  18  19   6
       15  24  25  20   7
       14  23  22  21   8
       13  12  11  10   9
求大神分析给思路
搜索更多相关主题的帖子: 编写程序 
2017-02-28 09:06
虾饺
Rank: 1
等 级:新手上路
帖 子:14
专家分:0
注 册:2017-2-27
收藏
得分:0 
我在论坛上看到过这个帖子,但由于本人太笨,看程序没有看明白,希望大神们帮我详细分析一下
2017-02-28 09:08
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9008
专家分:53957
注 册:2011-1-18
收藏
得分:10 
程序代码:
#include <stdio.h>

#ifndef min
#define min(a,b)    (((a) < (b)) ? (a) : (b))
#endif

unsigned foo( unsigned n, unsigned i, unsigned j )
{
    unsigned a = min( min(i,n-i-1), min(j,n-j-1) );
    return (4*a*(n-a-1)+2*n-1) + (1-(i<=j)*2)*(2*n-2*a-i-j-2);
}

int main( void )
{
    const unsigned n = 5;
    for( size_t i=0; i!=n*n; ++i )
        printf( "%4u%c", foo(n,i/n,i%n), " \n"[(i+1)%n==0] );

    return 0;
}
收到的鲜花
  • 九转星河2017-02-28 18:12 送鲜花  10朵   附言:好文章
2017-02-28 09:14
虾饺
Rank: 1
等 级:新手上路
帖 子:14
专家分:0
注 册:2017-2-27
收藏
得分:0 
回复 3楼 rjsp
谢谢您,但您写的我看不太懂,新手好多不会
2017-02-28 09:19
虾饺
Rank: 1
等 级:新手上路
帖 子:14
专家分:0
注 册:2017-2-27
收藏
得分:0 
需要C语言环境里的
2017-02-28 09:21
yangfrancis
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:贵宾
威 望:141
帖 子:1510
专家分:7661
注 册:2014-5-19
收藏
得分:0 
太强了。这几行就搞定
2017-02-28 09:48
虾饺
Rank: 1
等 级:新手上路
帖 子:14
专家分:0
注 册:2017-2-27
收藏
得分:0 
求分析
2017-02-28 13:58
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:10 
参考了2楼的写法~自己推了一次~结果return 里面的式子和2楼的差不多~感觉还是二楼的比较优~细看感觉优化一下应该能推导出2楼的式子~

程序代码:
#include<stdio.h>
#define N 5

int fun(int i,int j);
int min(int a,int b);

int main()
{
    int i=0;
    int j=0;

    for (i=1;i<=N;++i,printf("\n"))
        for (j=1;j<=N;++j)
            printf("%4d%c",fun(i,j),"\n "[j!=N+1]);

    return 0;
}

int fun(int i,int j)
{
    int a=min(min(i,N-i+1),min(j,N-j+1));//获取层数

    //int sum=4*(a-1)*(N-a+1);//求层数里面所有数值相加的数值和

    return i+j-2*(a-1)-1+4*(a-1)*(N-a+1)+2*(i>j)*((2*N-i-j)-2*(a-1));

}

int min(int a,int b)
{
    return (a<b?a:b);
}


[此贴子已经被作者于2017-2-28 18:18编辑过]


[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-02-28 18:12
虾饺
Rank: 1
等 级:新手上路
帖 子:14
专家分:0
注 册:2017-2-27
收藏
得分:0 
谢谢大神
2017-02-28 19:31
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
再补充解释一下~可以试试输出a,i+j,sum的值就可以帮助理解了~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-02-28 21:08
快速回复:螺旋方阵
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.014190 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved