CF118B 题解

· · 题解

题解区有不少打表做的,这里我讲一下我的方法——找规律,然后用函数一行一行地输出。

比如当 n = 5 时,输出如下:

          0
        0 1 0
      0 1 2 1 0
    0 1 2 3 2 1 0
  0 1 2 3 4 3 2 1 0
0 1 2 3 4 5 4 3 2 1 0
  0 1 2 3 4 3 2 1 0
    0 1 2 3 2 1 0
      0 1 2 1 0
        0 1 0
          0

输出字符个数の规律

第一行 10 个空格 1 个数,10 = 2|1 - 5 - 1|1 = (5 - |1 - 5 - 1|) \times 2 + 1

第二行 8 个空格 3 个数,8 = 2|2 - 5 - 1|3 = (5 - |2 - 5 - 1|) \times 2 + 1

第三行 6 个空格 5 个数,6 = 2|3 - 5 - 1|5 = (5 - |3 - 5 - 1|) \times 2 + 1

……

以此类推,第 ax 个空格 y 个数,x = 2|a - n - 1|y = 2(n - |a - n - 1|) + 1

for(int i = 1; i <= abs(a - n - 1) * 2; i++) cout<< " " ;

输出数字大小の规律

可以发现:

第一行 0 个数输出后下一次输出的数比当前输出的数多 11 个数输出后下一次输出的数比当前输出的数少 10 = 1 - 1

第二行 1 个数输出后下一次输出的数比当前输出的数多 12 个数输出后下一次输出的数比当前输出的数少 11 = 2 - 1

第三行 2 个数输出后下一次输出的数比当前输出的数多 13 个数输出后下一次输出的数比当前输出的数少 12 = 3 - 1

……(实际上当下一次输出的数为 -1 时,这一行已经不要输出了)

第六行 5 个数输出后下一次输出的数比当前输出的数多 16 个数输出后下一次输出的数比当前输出的数少 15 = 6 - 1

但是!

第七行 4 个数输出后下一次输出的数比当前输出的数多 15 个数输出后下一次输出的数比当前输出的数少 1

不过这时 4 = 2 \times 5 + 1 - 7……

所以可以得出以下的代码(其中 s = 2n + 1):

for(int i = 1; i < (n - abs(a - n - 1)) * 2 + 1; i++){
        cout<< b << " " ;
        if(i <= min(a - 1,s - a)) b++;
        else b--;
    }
    cout<< b << endl;

完整代码

#include<bits/stdc++.h>
using namespace std;
int n,s,i;
void anyu(int a){
    int b = 0;
    for(int i = 1; i <= abs(a - n - 1) * 2; i++) cout<< " " ;
    for(int i = 1; i < (n - abs(a - n - 1)) * 2 + 1; i++){
        cout<< b << " " ;
        if(i <= min(a - 1,s - a)) b++;
        else b--;
    }
    cout<< b << endl;
}
int main(){
    cin >> n;
    s = 2 * n + 1;
    for(i = 1; i <= s; i++) anyu(i);
    return 0;
}

简单吧。