正文

有趣的数阵2007-03-27 19:58:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/lingdlz/24329.html

分享到:

编程爱好者 论坛上某个网友出的,原帖如下:

请大家帮我仔细的提示一下这个回路的题目怎么做?怎样打出如下图案:
1   2   3   4   5   6
14  15  16  17  18  7
13  12  11  10  9   8

解题思路:很容易的我们发现这个数阵很有规律,假如我们有一个二维数组
          a[i][j],如果我们能把这些数按上面那样填进数组输出就不成问
          题了,我们发现第一行依次向右增加(从1开始),我们设个变量k
          首先设 k = 1,k按1增长填进数组,数组下标的规律是首先 j++;然后
          方向 变为向下即 i ++; 之后方向向左,即 i --, j --;随后向上即
          i --;最后又回到出发的方向,向右 ^_^.如果填数的过程中我们知道
          什么时候该向哪个方向走就好了,为了实现这个目的,我们可以将数组
          初始化为 0 ,并且在外围增加一层墙(设值为 1),遇到墙我们就回退
          因为我们知道方向变化的规律,我们按这个规律,遇到值为 0 的我们就
          把 k 填进去,并且增大 k 值以填下一个位置 。这里还要适当的将 i,j
          做些变化,方法就是这样,下面是我写的,用到了动态数组
最近忙于软考,时间不多,这个也是受LZ所托才写的,发了大半个小时,感觉挺有
意思就收到BLOG上了 !

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>

/* 在外围砌一层墙 */
void    InitMatrix(int r,int c,int *pMatrix){
    int i;

    for(i = 0; i <= c; i ++)
        *(pMatrix+(r-1)*c+i) = *(pMatrix+i) = 1;
    for(i = 0; i <= r; i ++)
        *(pMatrix+i*c) = *(pMatrix+c*(i+1)-1) = 1;
}
/* 填数据 */
void    SetDate(int r,int c,int *pMatrix){
    int k = 1, i = 0, j = 0;
    int max = (c-2)*(r-2);

    while(k <= max){
        for(i ++,j ++; !*(pMatrix + i*c + j); j ++)
            *(pMatrix + i*c + j) = k++;
        for(j--,i++; !*(pMatrix + i*c + j); i ++)
            *(pMatrix + i*c + j) = k++;
        for(i--,j--; !*(pMatrix + i*c + j); j --)
            *(pMatrix + i*c + j) = k++;
        for(j++,i--; !*(pMatrix + i*c + j); i --)
            *(pMatrix + i*c + j) = k++;
    }
}
/* 打印结果 */
void    PrintDate(int r,int c,int *pMatrix){
    int i,j;

    for(i = 1; i <= r-2; i ++){
        for(j = 1; j <= c-2; j ++)
            printf("%-4d ",*(pMatrix + i*c + j));
        printf("\n");
    }
}
/* 主函数 */
int main(){
    int *pMatrix;
    int r,c;

    printf("Enter row and column:");
    scanf("%d%d",&r,&c);
    pMatrix = (int*)malloc((r+2)*(c+2)*sizeof(int));
    if(!pMatrix){
        printf("Alloc memory failed!\n");
        return 1;
    }
    r += 2;
    c += 2;
    memset(pMatrix,0,r*c*sizeof(int));
    InitMatrix(r,c,pMatrix);
    SetDate(r,c,pMatrix);
    PrintDate(r,c,pMatrix);
    system("pause");
    return 0;
}

Enter row and column:10 13
1    2    3    4    5    6    7    8    9    10   11   12   13
42   43   44   45   46   47   48   49   50   51   52   53   14
41   76   77   78   79   80   81   82   83   84   85   54   15
40   75   102  103  104  105  106  107  108  109  86   55   16
39   74   101  120  121  122  123  124  125  110  87   56   17
38   73   100  119  130  129  128  127  126  111  88   57   18
37   72   99   118  117  116  115  114  113  112  89   58   19
36   71   98   97   96   95   94   93   92   91   90   59   20
35   70   69   68   67   66   65   64   63   62   61   60   21
34   33   32   31   30   29   28   27   26   25   24   23   22
请按任意键继续. . .

阅读(3492) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册