S字蛇形数组赋值

问题描述:输入一个整数,作为二维数组的行列,将二维数组中的值赋值成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


有人用算法直线过,但是我觉得推出那个公式还真复杂啊,我的方法比较笨但是比较直观
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

daiyier

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值