Chinaunix首页 | 论坛 | 博客
  • 博客访问: 525312
  • 博文数量: 118
  • 博客积分: 10028
  • 博客等级: 上将
  • 技术积分: 1820
  • 用 户 组: 普通用户
  • 注册时间: 2007-11-07 18:46
文章分类

全部博文(118)

文章存档

2009年(12)

2008年(106)

我的朋友

分类: C/C++

2008-10-30 14:22:00

这是线上风朋友做的恒生的笔试题~也是他提点了我一下。昨晚失眠,不过失眠的好啊,我睡到1点的时候想出来怎么做了,赶紧写在草稿本上...哈哈~

题目是这样的:
N*N的棋盘,N=5,让你打印输出如下,你可以构造一个A[N][N]的数组,然后填入结果后,打印出来。
1 16 15 14 13
2 17 24 23 12
3 18 25 22 11
4 19 20 21 10
5 6  7  8  9

规律:
    当N=5:则下4,右4,上4,左4;再下2,右2,上2,左2. 最后填入最后一个数,完成
    当N=6:则下4,右5,上5,左5;再下3,右3,上3,左3;再下1,右1,上1,左1;完成

代码

#include <stdio.h>

/* 可修改为你想输出的N */
#define N 5

int main()
{
    int A[N][N];
    int i,j,key=1,t;
    int count;

    for(i=0;i<N;i++)
        for(j=0;j<N;j++)
            A[i][j]=0;
    i=0;
    j=0;

    for(count=N-1;count>0;count-=2) /* 需要进行 N/2 轮 */
    {
        for(t=0;t<count;t++)
            A[i++][j]=key++; /* 向下 i递增 */

        for(t=0;t<count;t++)
            A[i][j++]=key++; /* 向右 j递增 */

        for(t=0;t<count;t++)
            A[i--][j]=key++; /* 向上 i递减 */

        for(t=0;t<count;t++)
            A[i][j--]=key++; /* 向左 j递减 */

        i++; /* 此时i和j指向这一轮的首元素,调整过来 */
        j++;
    }

    if(count == 0) /* 当count=-1时,数组已经排好,当=0时需要补上最后一个数 */
        A[N/2][N/2]=key;

    for(i=0;i<N;i++) /* 输出 */
    {
        for(j=0;j<N;j++)
            printf("%2d ",A[i][j]);
        printf("\n");
    }
    return 0;
}

阅读(1830) | 评论(0) | 转发(0) |
0

上一篇:几种排序方法[转]

下一篇:连表逆序

给主人留下些什么吧!~~