因为没有买语法课,所以看不了视频,我也是在群里看到有人问,然后刚好又写过蛇形矩阵的题,只要稍微变一下就行了,看了一下大佬们的题解,发现都是奇淫技巧啊%%%
如果不懂的话可以看看我的蛇形矩阵的题解
题目描述
输入整数N,输出一个N阶的回字形二维数组。
数组的最外层为1,次外层为2,以此类推。
样例
输入格式
输入包含多行,每行包含一个整数N。
当输入行为N=0时,表示输入结束,且该行无需作任何处理。
输出格式
对于每个输入整数N,输出一个满足要求的N阶二维数组。
每个数组占N行,每行包含N个用空格隔开的整数。
每个数组输出完毕后,输出一个空行。
数据范围
$0≤N≤100$
输入样例:
1
2
3
4
5
0
输出样例:
1
1 1
1 1
1 1 1
1 2 1
1 1 1
1 1 1 1
1 2 2 1
1 2 2 1
1 1 1 1
1 1 1 1 1
1 2 2 2 1
1 2 3 2 1
1 2 2 2 1
1 1 1 1 1
算法1
(数组,模拟) $O(n^2)$
这个一看就像蛇形填数或者蛇形矩阵,所以我们直接用蛇形矩阵的代码就行了,首先我们先填上起点的数,然后停止填数的条件是当前圈数是否小于n(从0开始)。每一个while代表一个方向,我们先判断下一个位置是否越界,然后再看这个位置有没有填数,先判断再走的好处就是不需要回退。需要注意的是,每一次我们都需要把数组中的数重新初始化为0,这个东西搞得我debug了好久2333。还有一种挺不错的写法 a[x = 0][y = 0] = 1
,直接初始化x,y并赋值,但是前提是先定义x,y。
时间复杂度
emmm,不太会算,还没看到时空复杂度分析
参考文献
【算法竞赛入门经典(第二版)】刘汝佳
C++ 代码
#include <cstdio>
#include <cstring>
using namespace std;
const int N = 1010;
int n;
int a[N][N] , b[N];
int main()
{
scanf("%d" , &n);
while(n)
{
int count = 0 , x = 0 , y = 0;
memset(a , 0 , sizeof(a));
a[0][0] = 1;
while(count < n)
{
count ++;
while(y + 1 < n && !a[x][y + 1]) a[x][++ y] = count;
while(x + 1 < n && !a[x + 1][y]) a[++ x][y] = count;
while(y - 1 >= 0 && !a[x][y - 1]) a[x][-- y] = count;
while(x - 1 >= 0 && !a[x - 1][y]) a[-- x][y] = count;
}
for(int i = 0; i < n; ++ i)
{
for(int j = 0; j < n; ++ j)
{
printf("%d " , a[i][j]);
}
printf("\n");
}
printf("\n");
scanf("%d" , &n);
}
return 0;
}