题目描述
蛇形矩阵,是由1开始的自然数一次排列成的N*N的正方形矩阵,数字依次由外而内的递增。如 N=3时蛇形矩阵为:
1 2 3
8 9 4
7 6 5
N=6时蛇形矩阵为:
1 2 3 4 5 6
20 21 22 23 24 7
19 32 33 34 25 8
18 31 36 35 26 9
17 30 29 28 27 10
16 15 14 13 12 11
输入蛇形矩阵宽度,动态分配二维数组,设置蛇形矩阵并输出结果。
输入
测试次数t
每组测试数据一行:数组大小N(>0)
输出
对每组测试数据,输出计算得到的蛇形矩阵。每行元素间以空格分隔,最后一个元素后无空格。
每组测试数据之间以空行分隔。
输入样例1
3
3
6
2
输出样例1
1 2 3\n
8 9 4\n
7 6 5\n
\n
1 2 3 4 5 6\n
20 21 22 23 24 7\n
19 32 33 34 25 8\n
18 31 36 35 26 9\n
17 30 29 28 27 10\n
16 15 14 13 12 11\n
\n
1 2\n
4 3
解决问题:
此题目为SZU的一道C++OJ,网络上已经存在许多解决方案,大部分是分析蛇形矩阵中元素和位置之间的变化关系,如今本人给出一种新的解决思路:
填充N阶蛇形矩阵 = 以1开始填入N阶蛇形矩阵的最外圈 + 以最后一个数字 + 1开始填充N-2阶矩阵,即过程为:依次填充上方行,右侧列,下方行,左侧列,最后再填充内层
getSnakeMatrix(N, beginAddtion){
writeTopRow()
writeRightColumn()
writeBottomRow()
writeLeftColumn()
getSnakeMatrix(N-2)
实现(要注意在getSnakeMatrix方法中处理索引i和j在每轮循环结束的额外一次自增或自减:
#include<iostream>
using namespace std;
void getSnakeMatrix(int** snakeMatrix, int begin, int end, int beginNum = 1);
int main()
{
int n;
cin >> n;
for (int i = 0;i < n;i++)
{
int width;
cin >> width;
int** snakeMatrix = new int*[width];
for (int i = 0;i < width;i++) {
snakeMatrix[i] = new int[width];
for (int j = 0;j < width;j++) {
snakeMatrix[i][j] = 0;
}
}
getSnakeMatrix(snakeMatrix, 0, width);
for (int i = 0;i < width;i++) {
for (int j = 0;j < width;j++) {
if (j == width - 1) {
cout << snakeMatrix[i][j] << endl;
}
else
{
cout << snakeMatrix[i][j] << ' ';
}
}
}
cout << endl;
for (int i = 0;i < width;i++) {
delete[] snakeMatrix[i];
}
delete[] snakeMatrix;
}
return 0;
}
void getSnakeMatrix(int**snakeMatrix, int begin, int end, int beginNum) {
if (begin >= end) {
return;
}
int i, j;
for (i = begin;i < end;i++) {
snakeMatrix[begin][i] = beginNum++;
}
i = i - 1;
for (j = begin + 1;j < end;j++) {
snakeMatrix[j][i] = beginNum++;
}
j = j - 1;
for (i = i - 1;i >= begin;i--) {
snakeMatrix[j][i] = beginNum++;
}
i = i + 1;
for (j = j - 1;j > begin;j--) {
snakeMatrix[j][i] = beginNum++;
}
j = j + 1;
getSnakeMatrix(snakeMatrix, begin + 1, end - 1, beginNum);
}