C程序:
#include "stdio.h"
/* X:首数字,N:行数 */
void display(int X, int N)
{
int i, j
for(i=0 i<N i++)
{
/* 输出每一行的前导空格 */
for(j=0 j<N-1-i j++)
printf(" ")
/* 输出数字部分的前一半(0..i) */
for(j=0 j<=i j++)
printf("%3d", X+i+j)
/* 输出数字部分的后一半(0..i-1) */
for(j=0 j<i j++)
printf("%3d", X+2*i-1-j)
printf("\n")
}
}
void main()
{
int X, N
printf("input first figure : ")
scanf("%d", &X)
printf("input rows : ")
scanf("%d", &N)
display(X, N)
}
运行测试:
对于这一问题,很容易想到用枚举的方法(深度搜索法)去解决,即列举出所有路径并记录每一条路径所经过的数字总和。然后寻找最大的数字总和,这一想法很直观,很容易编程实现其程序如下:program
sjx
const
maxn=10
var
a:array[1..maxn,1..maxn]
of
integer
max:longint
n,i,j:integer
fname:string
inputf:text
procedure
try(x,y,dep:integersum:longint)
begin
if
(dep=n)
then
begin
if
sum>max
then
max:=sum
exit
end
try(x+1,y,dep+1,sum+a[x+1,y])
try(x+1,y+1,dep+1,sum+a[x+1,y+1])
end
begin
readln(fname)
assign(inputf,fname)
reset(inputf)
readln(inputf,n)
for
i:=1
to
n
do
for
j:=
1
to
i
do
read(inputf,a[i,j])
max:=0
try(1,1,1,a[1,1])
writeln(max)
end.
但是当行数很大时,当三角形的行数等于100时,其枚举量之大是可想而知的,用枚举法肯定超时,甚至根本不能得到计算结果,必须用动态规划法来解。