论如何快速解出图形打印题目 发表于 2022-01-25 更新于 2022-01-25
字数总计 984 阅读时长 3分钟 阅读量
图形打印的题目想必大家都非常的熟悉,对于一些非常简单的经典题目(例如:打印正方形 、菱形、三角形等)应该都会写。我们今天就来总结一下图形打印的题目的解法。
简单题 我们还是用例题来讲解思路,现在假设我们需要打印一个指定宽(width
)高(height
)的直角三角形:
这种比较简单的图形打印题目,我们直接从上向下打印即可。那么我们首先需要考虑的便是空格数量和行标的关系,假设行标从1
开始。
观察图形可以发现,一行可能存在两段空格,即左端起始空格和三角内部空格。我们设左端起始空格的数量为Li
、三角内部空格数量为Ni
。
我们不难得出下面两个式子:
Li = width - i
Ni = (i - 2) * 2 - 1 (2 < i < height)
接下来只要在两段空格后面添加#
就可以了。
复杂题 但是对于一些题目比较复杂,可能当前行的内容与下面的行有关。比如下面这道题:
题目 这种题有两种解法,第一种是找规律,找一个公式来判断这一行的内容应当是什么;第二种就是先“打印”一部分内容,然后再回过头来“打印”剩下的内容。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 void printSpace ( int value) { for ( int i = 0 ; i != value; ++ i) putchar ( ' ' ) ; } int main ( ) { int n; cin >> n; int ch1 = 0 , ch2 = ( n - 1 ) % 26 ; n = ( n >> 1 ) - 1 ; for ( int i = n; i != - 1 ; -- i) { printSpace ( n - i) ; putchar ( char ( ch1 + 'A' ) ) ; ch1 = ( ch1 + 1 ) % 26 ; printSpace ( i << 1 ) ; printf ( "%c\n" , char ( ch2 + 'A' ) ) ; ch2 = ( ch2 + 25 ) % 26 ; } for ( int i = 0 ; i <= n; ++ i) { printSpace ( n - i) ; putchar ( char ( ch2 + 'A' ) ) ; ch2 = ( ch2 + 25 ) % 26 ; printSpace ( i << 1 ) ; printf ( "%c\n" , char ( ch1 + 'A' ) ) ; ch1 = ( ch1 + 1 ) % 26 ; } return 0 ; }
我们应该怎么做到打印完后面的再回到前面继续打印呢?
答案很简答,我们先把结果写入到字符串中,最后再向控制台输出就可以了。(当然使用windows.h
里面的API应该也是可以的)
这道题题干没有给出n
的范围,所以用这种方法写很可能会内存超限(调用API的话没有内存超限的问题),就不给出代码了。
说了这么多,我们做一道例题巩固一下
等腰三角形 本题目要求你输出一个由数字组成的等腰三角形。
具体的步骤是:
先用 1,2,3,… 的自然数拼一个足够长的串。 用这个串填充三角形的三条边。从上方顶点开始,逆时针填充。 比如,当三角形高度是 8 时:
输入格式 一个正整数n
,表示三角形的高度。 (3 < n
< 300)
输出格式 输出,用数字填充的等腰三角形。
为了便于测评,我们要求空格一律用“点”(.
)代替。
具体,可参照样例。
输入样例 8
输出样例
题解 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 string output[ 300 ] ; string key = "1" ; int numKey = 1 ; int pos = 0 ; void pushElement ( string& dist) { if ( pos == key. length ( ) ) { ++ numKey; pos = 0 ; key = to_string ( numKey) ; } dist. push_back ( key[ pos++ ] ) ; } int main ( ) { int n; cin >> n; int endIndex = n - 1 ; for ( int line = 0 ; line != endIndex; ++ line) { int space = n - line - 1 ; output[ line] . insert ( 0 , space, '.' ) ; pushElement ( output[ line] ) ; } int length = ( n << 1 ) - 1 ; for ( int i = 0 ; i != length; ++ i) pushElement ( output[ endIndex] ) ; for ( int line = endIndex - 1 ; line != 0 ; -- line) { int space = ( ( line - 1 ) << 1 ) + 1 ; output[ line] . insert ( output[ line] . length ( ) , space, '.' ) ; pushElement ( output[ line] ) ; } for ( int i = 0 ; i != n; ++ i) cout << output[ i] << '\n' ; return 0 ; }
创作不易,扫描下方打赏二维码支持一下吧ヾ(≧▽≦*)o
论如何快速解出图形打印题目 空 梦 | 山岳库博
更新于 2022-01-25
发布于 2022-01-25