题目描述
创建n阶螺旋矩阵并输出。
输入
输入包含多个测试用例&#xff0c;每个测试用例为一行&#xff0c;包含一个正整数n(1<&#61;n<&#61;50)&#xff0c;以输入0表示结束。
输出
每个测试用例输出n行&#xff0c;每行包括n个整数&#xff0c;整数之间用一个空格分割。
样例输入
4
0
样例输出
1 2 3 4
12 13 14 5
11 16 15 6
10 9 8 7
ps:对于这个题目本人很有感慨&#xff0c;之前已经遇到过两次了&#xff0c;但是因为自己觉得有点难&#xff0c;又觉得不重要&#xff0c;感觉有点偏僻&#xff0c;但是这次居然在自己的作业中遇到了这个题目&#xff0c;我觉得有必要写一篇题解来弥补我的过失~
先上一篇模拟题解&#xff0c;感觉模拟题解很容易理解&#xff0c;也容易编写&#xff0c;按照题目意思模拟一遍&#xff0c;在需要的地方变换方向&#xff0c;具体可以看代码理解&#xff0c;读者可以试图在纸上手动模拟一遍&#xff0c;我也是在纸上模拟一遍才理解的
#include
using namespace std;
int a[100][100];
void func(int n)
{int x &#61; 0, y &#61; -1; int x_add &#61; 0, y_add &#61; 1; int num &#61; n, num_add &#61; n; for (int i &#61; 1; i <&#61; n * n; &#43;&#43;i){x &#43;&#61; x_add;y &#43;&#61; y_add;a[x][y] &#61; i;if (i &#61;&#61; num) {if (y_add &#61;&#61; 1 || y_add &#61;&#61; -1) {x_add &#61; y_add;y_add &#61; 0;num_add--; num &#43;&#61; num_add; }else {y_add &#61; -x_add;x_add &#61; 0;num &#43;&#61; num_add; }}}
}
int main()
{int n;while (~scanf("%d", &n)){func(n);for (int i &#61; 0; i < n; &#43;&#43;i){for (int j &#61; 0; j < n; &#43;&#43;j)printf("%d ", a[i][j]);printf("\n");}}return 0;
}
递归
ps&#xff1a;我们可以把这个这个看成先进行外层打印&#xff0c;再进行内层打印&#xff0c;因为他的规模大致一样&#xff0c;所以我们就可以用递归来编写代码&#xff0c;如果矩阵是一层或者两层那么要特别判断一下&#xff0c;因为这个是递归结束条件&#xff08;奇数层偶数层&#xff09;&#xff0c;如果大于两层&#xff0c;那么我们先做外层&#xff0c;做完外层之后那么内层的长度就是外层长度减二&#xff0c;这个就相当于打正方形套着一个小正方形&#xff0c;这样递归的意思就很明显了&#xff0c;而且下一次递归的长度也就知道了。
#include
using namespace std;
const int maxn &#61; 60;
int n;
int a[maxn][maxn];
void f(int s, int e, int len, int k)
{if (len &#61;&#61; 1) {a[k][k] &#61; s;return; }else if (len &#61;&#61; 2) {a[k][k] &#61; s&#43;&#43;;a[k][k &#43; 1] &#61; s&#43;&#43;;a[k &#43; 1][k &#43; 1] &#61; s;a[k &#43; 1][k] &#61; e;return; }int col &#61; n &#43; 1 - k; int x &#61; s;for (int j &#61; k; j <&#61; col; j&#43;&#43;)a[k][j] &#61; x&#43;&#43;;for (int i &#61; k &#43; 1; i <&#61; col; i&#43;&#43;)a[i][col] &#61; x&#43;&#43;;for (int j &#61; col - 1; j >&#61; k; j--)a[col][j] &#61; x&#43;&#43;;for (int i &#61; col - 1; i >&#61; k &#43; 1; i--)a[i][k] &#61; x&#43;&#43;;f(x, n * n, len - 2, k &#43; 1);
}
int main()
{while (~scanf("%d", &n) && n){f(1, n * n, n, 1); for (int i &#61; 1; i <&#61; n; i&#43;&#43;){for (int j &#61; 1; j <&#61; n; j&#43;&#43;)printf("%d ", a[i][j]);printf("\n");}}return 0;
}