题目: 蛇形矩阵,是由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
要求:输入蛇形矩阵宽度,输出蛇形矩阵结果。
将矩阵像剥洋葱一样,层层剥离,每一次循环为矩阵的这一层赋值,若矩阵宽度为偶数,则矩阵无心,若宽度为奇数,则矩阵有心(单独的一个数),对于这种情况需要单独处理。
#include<iostream>
using namespace std;
void print(int n)
{
int **matrix = new int*[n];//建立二维数组
for (int k = 0; k < n; k++)
{
matrix[k] = new int[n];
}
int circle = 0;//循环次数
int v = 1;//矩阵初值
int i = 0, j = 0;
while (n-2*circle>=2)//以n-2*circle作为mark,若矩阵宽度为偶数,mark取到2时,矩阵赋值结束;若矩阵宽度为奇数,mark会取到1,此时需要单独处理。
{
for (j=circle; j < n-circle; j++)
{
matrix[i][j] = v;
v++;
}
j--;
i++;
for (i; i < n-circle; i++)
{
matrix[i][j] = v;
v++;
}
i--;
j--;
for (j; j >= circle; j--)
{
matrix[i][j] = v;
v++;
}
j++;
i--;
for (i; i > circle; i--)
{
matrix[i][j] = v;
v++;
}
i++;
circle++;
}
if (n-2*circle == 1)
{
j = circle;
matrix[i][j] = v;
}
for (i = 0; i < n; i++)//输出矩阵
{
for (j = 0; j < n; j++)
{
cout << matrix[i][j]<<" ";
}
cout << endl;
}
}
int main( )
{
int N;
cin >> N;
print(N);
return 0;
}
如下为运行结果: