(解题报告)NOJ1094--蛇形填数1

noj1094-蛇形填数
描述

在n×n方阵里填入1,2,…, n×n,要求填成蛇形(见样例)。

输入

输入正整数n,n≤64。

输出

输出蛇形矩阵,要求每个数格式宽度为5、右对齐。

样例输入

4

样例输出

10 11 12 1

9 16 13 2

8 15 14 3

7 6 5 4

解题思路:
典型到不能更典型的模拟题:
1.什么叫模拟,简单来说就是题目怎么说我就怎么做,结果先保存在数组中,最后输出。
首先我先让第一行的第n列为1,
然后一直向下,让这一列的值为分别为2,3,n,然后向左,然后向上,然后向右。
这里有几个注意点:
1,这里有两个判断条件,首先是是否达到数组边界,其次是是否继续往前,具体见代码.
2,关于循环次数的理解。
3,巧妙运用逻辑短路(否则程序很容易出现越界访问),以后遇到这种题目一律采用先判断再访问的方法。

具体代码如下:

#include <stdio.h>
#include <string.h>
 int main()
 {

     int a[65][65];
     int i,j,x,y,n,total;//x,y分别是横坐标,纵坐标,total是当前画到第几个数了
     memset(a,0,sizeof(a));//对数组清零
     scanf("%d",&n);
     x=1;//给各个变量初始化
     y=n;
     a[x][y]=1;//注意一定要赋值起始点为1
     total=1;
     while(total<n*n)//最后一定是n*n,我希望当total为n*n时跳出循环
     {
         while((x+1<=n)&&(!a[x+1][y]))//能否调换顺序
            a[++x][y]=++total;//注意先加加!
         while((y-1>=1)&&(!a[x][y-1]))
            a[x][--y]=++total;
         while((x-1>=1)&&(!a[x-1][y]))
            a[--x][y]=++total;
         while((y+1<=n)&&(!a[x][y+1]))
            a[x][++y]=++total;
     }      
     for (i=1;i<=n;i++)
     {
    for (j=1;j<=n;j++)
        printf("%5d",a[i][j]);
     printf("\n");
     }
     return 0;
 }

仅代表个人观点!

你可能感兴趣的:((解题报告)NOJ1094--蛇形填数1)