NYOJ-蛇形填数

蛇形填数

时间限制:3000 ms  |  内存限制:65535 KB
难度:3
描述
在n*n方陈里填入1,2,...,n*n,要求填成蛇形。例如n=4时方陈为:
10 11 12 1
9 16 13 2
8 15 14 3
7 6 5 4
输入
直接输入方陈的维数,即n的值。(n<=100)
输出
输出结果是蛇形方陈。
样例输入
3
样例输出
7 8 1
6 9 2
5 4 3
思路:手撸n=2,3,4,5,6,7,会发现各个位置的数字没有加减规律,不能直接打印,所以必须先赋值,再打印;赋值是从1开始,向里面旋转赋值,n为奇数有个中心点可以打出来,如果是偶数则没有中心点,比较麻烦。n*n矩阵,1从最后一列开始向下赋值,赋值到尽头向左,赋值到尽头再向上,然后再向左向下,循环下左上右。
举例n=6,先打从1开始向下初始化6次,然后向左5次,向上5次,向右4次,向下4次,向左3次,向上3次,向右2次,向下2次,向左1次,向上1次。
简单点表示,循环下左右上,分别初始化赋值 6 5 5 4 4 3 3 2 2 1 1次
再举例n=5,先打从1开始向下初始化5次,然后向左4次,向上4次,向右3次,向下3次,向左2次,向上2次,向右1次,向下1次。  
简单点表示,循环下左右上,分别初始化赋值5 4 4 3 3 2 2 1 1次
发现规律,先初始化赋值一列n个,之后每次初始化赋值次数逐渐减少,并且矩阵一行一列的初始化个数一样。
第一列比较特殊,可以另外初始化,其他则按规律写代码,那就是左上右下赋值。
需要实现的功能:1、拐弯,左上右下的规律 2、n到1逐渐递减 3、每次赋值2次 4、数组内容逐渐增加
AC代码:
#include<stdio.h>
#include<iostream>
#include<cstring>
using namespace std;
int a[101][101];

///左上右下
int shu[4]={0,-1,0,1};
int heng[4]={-1,0,1,0};

int main()
{
    memset(a,0,sizeof(a));
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)   ///先赋值最后一列
        a[i][n]=i;
    int num;                ///每次赋值到底的个数
    num=n-1;                ///从n-1开始
    int f=0,r;              ///判断方向,r=f%4,0123分别是左上右下
    int x=n,y=n,m=n;        ///数组下标,从右下角开始
    for(int i=num;i>=1;i--)
    {
        int t=2;
        while(t--)
        {
            r=(f++)%4;
            for(int j=0;j<i;j++)///i次
            {
                x=x+shu[r];
                y=y+heng[r];
                a[x][y]=++m;
            }
        }
    }
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
        if(j!=n) printf("%d ",a[i][j]);
        else printf("%d\n",a[i][j]);
    }
    return 0;
}

 

posted @ 2018-08-26 21:42  守林鸟  阅读(191)  评论(0编辑  收藏  举报