
Free Pascal找错,大神帮忙!!(死循环)
在如图所示的一个数字三角形宝塔中数字三角形的数字为不超过100的整数。现规定从最顶层走到最底层,每一步可沿左斜线向下或右斜线向下走。假设三角形行数≤15,对于给定的一个整...
在如图所示的一个数字三角形宝塔中数字三角形的数字为不超过100的整数。现规定从最顶层走到最底层,每一步可沿左斜线向下或右斜线向下走。假设三角形行数≤15,对于给定的一个整数值m,编程确定是否存在一条路径,使得沿着该路径所经过的数字的总和恰为m,若存在则给出所有路径,若不存在,则输出‘No Answer!’字样。
[样例输入]
524(数塔有5行,m的值为24)
7
3 8
8 10
2 74 4
4 52 6 5
[样例输出]
7 80 4 5
7 38 2 4
Total:2
我的程序:
var
a:array[1..15,1..15]of integer;
b:array[1..14]of integer;
total,i,j,n,m,s,k:integer;
tf:boolean;
begin
readln(n,m);
for i:=1 to n do begin
for j:=1 to i do
read(a[i,j]);
readln;
end;
fillchar(b,sizeof(b),0);
total:=0;
repeat
i:=1;j:=1;
s:=a[i,j];
for k:=1 to n-1 do begin
if b[k]=0 then inc(i)
else begin inc(i);inc(j);end;
inc(s,a[i,j]);
end;
if s=m then begin
write(a[1,1]);
i:=0;j:=0;
for k:=1 to n-1 do begin
if b[k]=0 then inc(i)
else begin inc(i);inc(j);end;
writeln(' ',a[i,j]);
end;
inc(total);
end;
tf:=true;
for k:=1 to n-1 do if b[k]=0 then tf:=false;
if tf then break;
inc(b[n-1]);
if b[n-1]=2 then begin
b[n-1]:=0;
s:=n-2;
while b[s]=1 do begin
b[s]:=0;
dec(s);
end;
s:=1;
end;
until tf;
if total=0 then writeln('No Answer!')
else writeln('Total:',total);
end.
请各位帮我找一下错。我的程序死循环。 展开
[样例输入]
524(数塔有5行,m的值为24)
7
3 8
8 10
2 74 4
4 52 6 5
[样例输出]
7 80 4 5
7 38 2 4
Total:2
我的程序:
var
a:array[1..15,1..15]of integer;
b:array[1..14]of integer;
total,i,j,n,m,s,k:integer;
tf:boolean;
begin
readln(n,m);
for i:=1 to n do begin
for j:=1 to i do
read(a[i,j]);
readln;
end;
fillchar(b,sizeof(b),0);
total:=0;
repeat
i:=1;j:=1;
s:=a[i,j];
for k:=1 to n-1 do begin
if b[k]=0 then inc(i)
else begin inc(i);inc(j);end;
inc(s,a[i,j]);
end;
if s=m then begin
write(a[1,1]);
i:=0;j:=0;
for k:=1 to n-1 do begin
if b[k]=0 then inc(i)
else begin inc(i);inc(j);end;
writeln(' ',a[i,j]);
end;
inc(total);
end;
tf:=true;
for k:=1 to n-1 do if b[k]=0 then tf:=false;
if tf then break;
inc(b[n-1]);
if b[n-1]=2 then begin
b[n-1]:=0;
s:=n-2;
while b[s]=1 do begin
b[s]:=0;
dec(s);
end;
s:=1;
end;
until tf;
if total=0 then writeln('No Answer!')
else writeln('Total:',total);
end.
请各位帮我找一下错。我的程序死循环。 展开
- 你的回答被采纳后将获得:
- 系统奖励15(财富值+成长值)+难题奖励10(财富值+成长值)+提问者悬赏15(财富值+成长值)
1个回答
展开全部
层数最大才15 用回溯法
const
ax:array[1..2,1..2]of integer=((1,1),(1,0));
var
a:array[1..16,1..16]of integer;
b:array[1..16]of integer;
i,j,n,m,s,len,total:longint;
procedure print;
var
l:longint;
begin
for l:=1 to len-1 do write(b[l],' ');
writeln(b[len]);
end;
procedure search(x,y:longint);
var
t:integer;
begin
if s=m then
begin
print;
inc(total);
exit;
end;
if(x>n)or(y>n)then exit;
for t:=1 to 2 do
begin
inc(len);
x:=x+ax[t,1];
y:=y+ax[t,2];
s:=s+a[x,y];
b[len]:=a[x,y];
search(x,y);
s:=s-a[x,y];
x:=x-ax[t,1];
y:=y-ax[t,2];
dec(len);
end;
end;
begin
read(n,m);
for i:=1 to n do
begin
for j:=1 to i do read(a[i,j]);
readln;
end;
s:=a[1,1];
b[1]:=a[1,1];
len:=1;
search(1,1);
if total<>0 then write('total:',total)else write('No Answer!');
end.
一定要走到底吗 要走到底的话自己修改一下
至于你的程序 自己按F8一行行运行 看看哪句出了问题
const
ax:array[1..2,1..2]of integer=((1,1),(1,0));
var
a:array[1..16,1..16]of integer;
b:array[1..16]of integer;
i,j,n,m,s,len,total:longint;
procedure print;
var
l:longint;
begin
for l:=1 to len-1 do write(b[l],' ');
writeln(b[len]);
end;
procedure search(x,y:longint);
var
t:integer;
begin
if s=m then
begin
print;
inc(total);
exit;
end;
if(x>n)or(y>n)then exit;
for t:=1 to 2 do
begin
inc(len);
x:=x+ax[t,1];
y:=y+ax[t,2];
s:=s+a[x,y];
b[len]:=a[x,y];
search(x,y);
s:=s-a[x,y];
x:=x-ax[t,1];
y:=y-ax[t,2];
dec(len);
end;
end;
begin
read(n,m);
for i:=1 to n do
begin
for j:=1 to i do read(a[i,j]);
readln;
end;
s:=a[1,1];
b[1]:=a[1,1];
len:=1;
search(1,1);
if total<>0 then write('total:',total)else write('No Answer!');
end.
一定要走到底吗 要走到底的话自己修改一下
至于你的程序 自己按F8一行行运行 看看哪句出了问题
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?

2025-02-17 广告
联韬企业管理咨询有限公司是专注在供应链管理和运营管理领域的培训咨询机构,承办CPIM/CSCP/CLTD/SCOR DS认证项目的教育培训及考试管理,为企业和个人提供教育培训,专业认证考试和咨询指导服务。帮助企业实施和改进管理流程;提高管理...
点击进入详情页
本回答由上海联韬企业提供
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询