我之前发过一个关于类似想法的问题,但是有一个矩形, 这一次,我得到了一个任务,我应该以这种方式画一个等腰直角三角形: 我得到三角形边缘的大小作为用户的输入; 三角形的角度将位于屏幕的左上角,三角形的框架将由字母a构成,内部三角形的框架将由b构成,内部三角形的内部框架的内部框架将由c等等......
例如:
aaaaaaaaaaaa
abbbbbbbbba
abccccccba
abcdddcba
abcddcba
abcdcba
abccba
abcba
abba
aba
aa
a
这是我到目前为止所得到的:
#include <stdio.h>
int main()
{
int length, originalLength;
int counterRows, counterLength;
scanf("%d", &length);
originalLength=length;
for (counterRows=0 ; length > 0; --length, ++counterRows)
{
for(counterLength=0; counterLength<length ;++counterLength)
{
if (counterRows == 0 || counterLength >= originalLength - 2)
printf("%c",'a');
else if (counterRows == 1 || counterRows == originalLength -3)
if (counterLength == 0 || counterLength == length -1)
printf("%c",'a');
else
printf("%c",'a'+1);
else
if (counterLength == 0 || counterLength == length - 1)
printf("a");
else if (counterLength == 1 || counterLength == length - 2)
printf("%c",'a'+1);
else
printf("%c",'a'+2);
}
printf("\n");
}
return 0;
}
然后我注意到我不断重复自己,直到我到达字母z,我才能真正做到这一点。还有什么更好的方法可以用于这种算法?谢谢!
答案 0 :(得分:1)
计算一般结构的一种方法是观察三角形行内有三角形图案。考虑一个大小为10的三角形,这意味着顶行是10个字符长。看看前四行:
aaaaaaaaaa
abbbbbbba
abccccba
abcdcba
abccba
abcba
abba
aba
aa
a
第一行有 10 'a'
个字符,第二行有 7 'b'
个字符, 4 {{1第三行中的字符,第四行中的 1 'c'
字符。我们可以将这些行分解为中间段和外段:
'd'
中间段的长度为 aaaaaaaaaa aaaaaaaaaa ..........
abbbbbbba .bbbbbbb. a.......a
abccccba ..cccc.. ab....ba
abcdcba ...d... abc.cba
,其中size-3*i
是顶行的长度,size
是行索引,从顶部的0开始。外部细分由左侧i
到'a'
的字符组成,右侧为相反的序列。
三角形的底部怎么样?它在'a'+i-1
为负时启动。
size-3*i
每行都有一个上升和下降的字符序列。例如,在六个字符的行中,我们可以通过将0,1,2,2,1,0顺序添加到基本字符 abccba
abcba
abba
aba
aa
a
来计算每个字符。
'a'
在五个字符的行中,序列为0,1,2,1,0:
a b c c b a
0 1 2 2 1 0
通常,对于一行 a b c b a
0 1 2 1 0
个字符,索引length
处的字符的值为j
或'a'+j
,以较小者为准。
让我们用一行六个字符来说明这一点。
'a'+length-1-j
总而言之,我们可以使用以下代码生成三角形。
n = 6:
j = 0 1 2 3 4 5
n-1-j = 5 4 3 2 1 0
min(j, n-1-j) = 0 1 2 2 1 0
下面是一个完整的程序,它从命令行获取三角形的大小。您可以使用 for (i = 0; i < size; ++i) {
middle = size-3*i;
if (middle >= 0) { /* Upper portion of the triangle. */
for (j = 0; j < i; ++j) {
printf("%c", 'a'+j); /* Left segment: abc... */
}
for (j = 0; j < middle; ++j) {
printf("%c", 'a'+i); /* Middle: size-3*i characters */
}
for (j = i-1; j >= 0; --j) {
printf("%c", 'a'+j); /* Right segment: ...cba */
}
} else { /* Now we're in the lower portion. */
length = size-i;
for (j = 0; j < length; ++j) {
printf("%c", 'a'+(j < length-1-j ? j : length-1-j));
} /* Rising and falling sequence. */
}
printf("\n");
}
轻松修改它以读取所需的大小,就像您在问题中显示的代码一样。
scanf
答案 1 :(得分:0)
#include <stdio.h>
#define min(a,b) a < b ? a : b
void print_line(int len, int row, int level){
int deep = min(row, level);
if(len > 1){
putchar('a' + deep);
print_line(len-2, row, level + 1);
putchar('a' + deep);
} else if(len == 1){
putchar('a' + deep);
}
}
int main(){
int length, originalLength;
int i;
scanf("%d", &length);
originalLength=length;
for(i=0; i< originalLength; ++i){
print_line(length--, i, 0);
putchar('\n');
}
return 0;
}