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); 
} 

posted on 2021-09-25 20:13  Atl212  阅读(55)  评论(0)    收藏  举报

导航