输入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----
发现一位大佬的算法,非常牛逼,研究了一下,发现吊炸天,下次把思路写出来。