题目:

打印图形
1
3 2
4 5 6
10 9 8 7

题解:

思路:

  1. 首先利用双重循环打印斜三角形框架。
  2. 将数字按位置顺序存放。
  3. 将偶数列的数据逆序排列,打印。

注意:

这里需要注意的有两点:

  1. 如何指定数组中某个位置的逆序输出。

    vector的升序排序是sort(a.begin(),a.end()),降序排序为sort(a.rbegin(),a.rend()).

    这里需要注意一下:

    c.begin() 返回一个迭代器,它指向容器c的第一个元素

    c.end() 返回一个迭代器,它指向容器c的最后一个元素的下一个位置

    c.rbegin() 返回一个逆序迭代器,它指向容器c的最后一个元素

    c.rend() 返回一个逆序迭代器,它指向容器c的第一个元素前面的位置

    逆向迭代器是一种反向遍历容器的迭代器。也就是,从最后一个元素到第一个元素遍历容器。反向迭代器将自增(和自减)的含义反过来了:对于反向迭代器,++ 运算将访问前一个元素,而 – 运算则访问下一个元素。

    image-20200908120007266

    执行并观察以下程序帮助理解:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #include<bits/stdc++.h>

    using namespace std;

    int main(){
    int n=4,s=0;
    //cin>>n;
    vector<int> a;
    for (int i=0;i<=n*n;i++) a.push_back(i);
    sort(a.rbegin()+2,a.rend()-5);
    for(int i=0;i<n*n;i++) cout<<a[i]<<" ";
    return 0;
    }

    输出结果如下:

    image-20200908115922322

  2. 偶数列在数组中的坐标。

    由题目可以观察得出,

    需要排序的起始位置为之前输出的位数总和,终止位置为本行及本行以上的位数总和。

    image-20200908120506235

    得出表达式(1/2)n(n+1)。

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include<bits/stdc++.h>

using namespace std;

int main(){
int n,s=0;
cin>>n;
vector<int> a;
for (int i=1;i<=n*n;i++) a.push_back(i);
for (int i=0;i<n;i++) {
if((i+1)%2==0) sort(a.rend()-0.5*(i+1)*(i+1+1),a.rend()-0.5*(i)*(i+1));
for(int j=n-i-1;j<n;j++) {
cout<<a[s++]<<" ";
}
cout<<endl;
}
return 0;
}