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