问题描述:输入一个整数,作为二维数组的行列,将二维数组中的值赋值成S蛇形。
Input:m=5
Output:
1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9
有人用算法直线过,但是我觉得推出那个公式还真复杂啊,我的方法比较笨但是比较直观
其核心思想是:如果输入5,那么先计算有几圈要填充,这里计算的是第0到(n-1)/2圈,也就是说,当n=5时,要填充第0到2圈
每一圈的没一条变都是填充边长减1,那么四条变就可以形成一个完整的矩形了,没有重叠的地方哦~一次填充完每一圈就可以了。。。
程序实现如下:
#include <iostream>
using namespace std;void SSnakeArr(int** a,int n)
{
int k=1,i0,j0;
for (int i=0; i<=(n-1)/2;i++)//圈数
{
if (i == (n-1)/2)//如果是奇数,最后一个数字就是最中间的那个数字是n的平方
{
a[i][i] = n*n;
}
for (j0=i;j0<n-1-i;j0++)//上面从做往右,填充n-2*i-1个数字
{
a[i][j0] = k++;
}
for (i0=i;i0<n-1-i;i0++)//右边从上往下,填充n-2*i-1个数字
{
a[i0][j0] =k++;
}
for (;j0>i;j0--)//下边从有往左,填充n-2*i-1个数字
{
a[i0][j0] = k++;
}
for (;i0>i;i0--)//左边从上往下,填充n-2*i-1个数字
{
a[i0][j0] = k++;
}
}
}
void TestOfSSnakeArr()//测试用例
{
int m ;
cout<<"m=";
cin>>m;
int** a = new int*[m];
a[0] = new int[m*m];
for(int k = 1; k < m; k++)
{a[k] = a[k-1] + m;
}
for (int i0=0;i0<m;i0++)
{
for (int j0=0;j0<m;j0++)
{
a[i0][j0] = 0;
}
}
SSnakeArr(a,m);
for (int i1=0 ;i1<m;i1++)
{
for(int j1=0; j1<m;j1++){
printf("%3d",a[i1][j1]);
}
printf("\n");
}
}
void main()
{
TestOfSSnakeArr();
system("pause");
}
运行结果:
m=8
1 2 3 4 5 6 7 8
28 29 30 31 32 33 34 9
27 48 49 50 51 52 35 10
26 47 60 61 62 53 36 11
25 46 59 64 63 54 37 12
24 45 58 57 56 55 38 13
23 44 43 42 41 40 39 14
22 21 20 19 18 17 16 15
有人用算法直线过,但是我觉得推出那个公式还真复杂啊,我的方法比较笨但是比较直观