斜线填充,蛇形填充数组

输入row和col(两者都小于100),按照下图对数组进行填充,第一个位置填1,到最后一个填row*col。

输入样例:n和m,空格隔开:

4 5

输出样例:填充好的矩阵(注意有对齐):

 1  2  4  7 11 
 3  5  8 12 15 
 6  9 13 16 18 
10 14 17 19 20    

数据范围:1<=n, m<=10

 

我的代码如下,因为当时时间的原因没有想出更好的算法,如果哪位大佬有更好的算法请不吝赐教,先谢谢:

#include <iostream>
#include <iomanip>
using namespace std;

int main(){

    int n=0,	//col -> m
        m=0;	//row -> n
    cin>>n>>m;	//input

    //2d array
    int **array;
    array=new int*[n];
    for(int k=0; k<n; k++)
        array[k]= new int [m];

    //set array first elements
    int s=1;
    //set up dire
    for(int k=0; k<m; k++){
        int d=0;
        for (int h = k; h >= 0 && d<n; h--) {
                array[d++][h] = s++;
        }
    }

    //set down dire
    for(int k=1; k<n; k++){
        int d=k;
        for(int h=m-1; h>=0 && d<n; h--){ //update: Set the boundary of h
            array[d++][h]=s++;
        }
    }

    //print to check
    for(int i=0; i<n; i++){
        for(int j=0; j<m;j++){
            cout<<setw(4)<<array[i][j];
        }
        cout<<endl;
    }

    return 0;
}

输出结果:

6 6
   1   2   4   7  11  16
   3   5   8  12  17  22
   6   9  13  18  23  27
  10  14  19  24  28  31
  15  20  25  29  32  34
  21  26  30  33  35  36
5 6
   1   2   4   7  11  16
   3   5   8  12  17  21
   6   9  13  18  22  25
  10  14  19  23  26  28
  15  20  24  27  29  30
1 6
   1   2   3   4   5   6

 

----更新1:2019/6/14----

发现一个bug当输入“10 1”时出现的结果是:

   1
   2
  11
  19
  26
  32
  37
  41
  44
  46

但是发现输入“1 10”的时候结果又是正确的:

1   2   3   4   5   6   7   8   9  10

再结合之前测试的“6 6”和“5 6”还有“4 6”,可以确定是第二段set down dire的问题,而问题应该是在界限上,然后一看第三十行:

for(int h=m-1; d<n ; h--)

当输入“10 1”时 n=10,m=1,这时候h的会出现负数,果然是边界问题,所以设置下h的界限就好了都不用断点debug:

for(int h=m-1; h>=0 && d<n; h--)

然后输入看看结果:

10 1
   1
   2
   3
   4
   5
   6
   7
   8
   9
  10
5 3
   1   2   4
   3   5   7
   6   8  10
   9  11  13
  12  14  15

Okay! 现在基本没有问题啦!

 

----更新2:2019/6/14----

发现一位大佬的算法,非常牛逼,研究了一下,发现吊炸天,下次把思路写出来。

链接

链接

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值