L1-002 打印沙漏 (20 point(s))
-
之前乙级题库写过此题,用了数学关系来表示每行图案和空格的数量 PAT (Basic Level) 1027 打印沙漏 (20 point(s)) 。这次写重新试着推导这个数量关系,开始的时候思路有些问题,导致花了不少时间。实际k题四十分钟,推了三十分钟数学关系,十分钟写代码。
推关系时候的问题在搞错了函数,由于图案和空格与行数关系的图像实际是折线,所以应该用绝对值函数 |x| 作为变换的基础,而不是一次函数 |kx + b| 。
当然用一次函数也不是不行,但是要以转折点作为上下左右平移的基本点。不过我还不是很理解 abs 取绝对值的 | | 应该放在哪个变量前面。所以还是以 |x| 作为变换基础更熟悉和方便。
-
不过这题如果不用刻意的数量关系,来连接每一行打印的空格和图案,也可以分开上下两个部分进行打印。之后见到类似题目可以试试,对比下哪个切入方法更效率。
#include <bits/stdc++.h>
using namespace std;
int main(){
int line = 0, num;
char c;
cin >> num >> c;
while(2 * pow(line+1, 2) - 1 <= num){
line++;
}
for(int i = 1; i <= line * 2 - 1; i++){
// 打印空格
for(int j = 1; j <= line - 1 - abs(i - line); j++)
cout << ' ';
// 打印图案
for(int j = 1; j <= 2 * abs(i - line) + 1; j++)
cout << c;
cout << endl;
}
cout << num - (2 * pow(line, 2) - 1);
}
浙公网安备 33010602011771号