NYOJ-33-蛇形填数

描述
在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

之前做过一道几乎一摸一样的题,也是回型输出,只不过有一点区别是,这个输出刚好和那个输出是按照y轴对称,输出,并且是回的方向也有略微的差别,于是改写了一下。

#include <stdio.h>
#include <string.h>
int map[101][101];

int main(int argc, const char * argv[])
{
    int N;
    int i, j;

    while (~scanf("%d", &N))
    {
        memset(map, 0, sizeof(map));
        map[0][0] = 1;

        for (i = 1; i < N * 1.0 / 2; i++)
        {
            map[i][i] = map[i - 1][i - 1] + (N - 2 * (i - 1) - 1) * 4;
        }
        for (j = 0; j < N / 2; j++)
        {
            for (i = j + 1; i < N - j; i++)
            {
                map[i][j] = map[i - 1][j] + 1;
            }
        }
        for (i = N - 1; i > N / 2 - 0.5; i--)
        {
            for (j = N - i; j < i + 1; j++)
            {
                map[i][j] = map[i][j - 1] + 1;
            }
        }
        for (j = N - 1; j >= N / 2; j--)
        {
            for (i = j - 1; i > N - j - 2; i--)
            {
                map[i][j] = map[i + 1][j] + 1;
            }
        }
        for (i = 0; i < N / 2; i++)
        {
            for (j = N - i - 2; j > i; j--)
            {
                map[i][j] = map[i][j + 1] + 1;
            }
        }

        for (i = 0; i < N; i++)
        {
            for (j = N - 1; j > 0; j--)
            {
                printf("%d ", map[i][j]);
            }
            printf("%d\n", map[i][0]);
        }
// for (i=0; i<N; i++)
// {
   
// for (j=0; j<N; j++)
// {
   
// printf("%d\t",map[i][j]);
// }
// printf("\n");
// }
    }

    return 0;
}

但是这种写法劳民伤财,一开始我还感觉我的写法很高级,可是当我遇见了一种顶好的方法时,我不得不承认,我的写法真的很不划算了。

#include <stdio.h>
#include <string.h>
#define MaxSize 100

int main()
{
    int a[MaxSize][MaxSize];
    int n, x = 0, y, tot=0;

    scanf("%d",&n);
    y = n - 1;
    memset(a, 0, sizeof(a));

    tot = a[x][y] = 1;
    while(tot < n * n)
    {
        while(x + 1 < n && !a[x+1][y])
            a[++x][y] = ++tot;
        while(y - 1 >= 0 && !a[x][y-1])
            a[x][--y] = ++tot;
        while(x - 1 >= 0 && !a[x - 1][y])
            a[--x][y] = ++tot;
        while(y + 1 < n && !a[x][y+1])
            a[x][++y] = ++tot;
    }

    for(x = 0; x < n; x++)
    {
        for(y = 0; y < n; y++)
            printf("%5d", a[x][y]);
        printf("\n");
    }

    return 0;
}
    核心代码就短短的几行,比我的写法强太多了,无论是效率还是内存上,尤其是代码复杂度上,都优化了一大截,默默点个赞,我的思维太固化了,需要不断的革新自己了,不能总是停留在以前的程度上,不能遇见相似的问题就想着拷贝自己以前的代码或者改写(事实证明,改写代码是一个灾难,莫大的灾难呀),我应该想想看如何写出更加高效的代码。
    学如逆水乘舟,不进则退——致自己。
全部评论

相关推荐

Pandaileee:校友加油我现在也只有一个保底太难了
点赞 评论 收藏
分享
头像
11-06 10:58
已编辑
门头沟学院 嵌入式工程师
双非25想找富婆不想打工:哦,这该死的伦敦腔,我敢打赌,你简直是个天才,如果我有offer的话,我一定用offer狠狠的打在你的脸上
点赞 评论 收藏
分享
11-11 14:21
西京学院 C++
无敌混子大王:首先一点,不管学校层次怎么样,教育经历放在第一页靠上位置,第一页看不到教育经历,hr基本直接扔掉了
点赞 评论 收藏
分享
1 收藏 评论
分享
牛客网
牛客企业服务