zoukankan      html  css  js  c++  java
  • wikioi 1160 蛇形矩阵

    /*========================================================================
    1160 蛇形矩阵
    题目描述 Description
        小明玩一个数字游戏,取个n行n列数字矩阵(其中n为不超过100的奇数),数字的填补方法为:在矩阵中心从1开始以逆时针方向绕行,逐圈扩大,直到n行n列填满数字,请输出该n行n列正方形矩阵以及其的对角线数字之和.
    输入描述 Input Description
        n(即n行n列)
    输出描述 Output Description
        n+1行,n行为组成的矩阵,最后一行为对角线数字之和
    样例输入 Sample Input
        3
    样例输出 Sample Output
        5 4 3
        6 1 2
        7 8 9
        25
    数据范围及提示 Data Size & Hint
    ==========================================================================*/

    解析:

    下面是n等于7和n等于5的时候数组的样子:

       

    填充数组的方式 如下:

    先手动填充数字1(其位置为(n/2,n/2),如上图所示。)
    然后一层一层地填充其余部分的数据。(层数m=n/2)
    对每一层的填充,按如下顺序处理:

    先填充右边这一列(这一列最底下的数据先不填充,下同。)

    接着填充上边的横行,然后填充左边这一列,最后填充下边的横行。

    (每一段的填充范围如图颜色所示。)

    对第x层(1<=x<=m),填充某一段时,该段数据个数为2*x。

    比如n=5,第一层每一段的个数是2,第二层每一段的个数是4.

    n=7时,第三层每一段的个数是6.

    ……所以,每一段的循环次数k=2*x。

    下面的代码对这一点的处理稍微不同,但本质一样。下面的k从2开始,k/2要小于或等于m即可。

    (段与段之间要注意修改坐标)

    下面是代码:

    #include<stdio.h>
    int main()
    {
        int i,j,n,a[100][100],k,m,t,p,sum=0;
        scanf("%d",&n);
        i=j=n/2;//最内层的1所在的位置 
        m=n/2;//循环填充的层数(不包括最内层的1) 
        a[i][i]=1;
        t=2;//准备放进数组的数据
        for(k=2;k/2<=m;k=k+2) 
        {
            j=j+1;
            for(p=1;p<=k;p++)//填充右侧这一列
            {
                a[i][j]=t;
                t++;
                i--;
            }
            i++;
            j--;
            for(p=1;p<=k;p++)//填充上边这一横行
            {
                a[i][j]=t;
                t++;
                j--;
            }
            j++;
            i++;
            for(p=1;p<=k;p++)//填充左边这一列
            {
                a[i][j]=t;
                t++;
                i++;
            }
            i--;
            j++;
            for(p=1;p<=k;p++)//填充下面这一横行
            {
                a[i][j]=t;
                t++;
                j++;
            }
            j--;
        }
        for(i=0;i<n;i++)//输出数组顺便求对角线元素的和
        {
            for(j=0;j<n;j++)
            {
                printf("%5d ",a[i][j]);
                if(i==j||i+j==n-1)  sum=sum+a[i][j];
            }
            printf("
    ");
        }
        printf("%d
    ",sum);
        return 0;
    }
  • 相关阅读:
    oracle序列
    json对象操作
    web项目中常出现的异常
    Builder设计模式
    getParameter("name")和 getParamterValues("name")的区别
    多条件查询生成sql语句
    安装pl/sql
    修复google浏览器
    创建JAVA项目的几个选项
    类的初始化顺序
  • 原文地址:https://www.cnblogs.com/huashanqingzhu/p/3458514.html
Copyright © 2011-2022 走看看