<Pascal笔迹>>>和为零
作者:A_Ender
[题目介绍]
有n个数,分别是1,2..n,要你用加减或什么都不干,来使整个连起来的算式和为零。
[样例输入,输出]
输入1:5
输出1:1 2-3-4-5
输入2:6
输出2:1 2+3-4-5-6
[题目数据]
16>n>0
{本题套路}
搜索快线直通答案,注意可以什么都不干。
{算法详解}
{1}2到n个符号全部搜一遍(for i:=1 to 3 do)分别是空,+,-,然后调用和回溯。
{2}到n+1了判断是否为0。(当然你在n最后的if的时候也可以判断)
{算法演示}
回溯太难演示了(前几次我还有点耐心),还是看下图吧。
1 |
( )(+)(--) |
2 |
( )(+)(--) |
3 \/
得出:1+2-3=0
<代码实现>
var
n,i:longint;
a,b:array[1..1000] of longint;
function sc:longint;
var
b,c,i,k:longint;
begin
b:=1;
c:=0;
k:=2;
for i:=2 to n+1 do
begin
case a[i] of
1:b:=b*10+i;
2,3:begin
if k=2 then c:=c+b else c:=c-b;
k:=a[i];
b:=i;
end;
end;
end;
sc:=c;
end;
procedure dg(x:longint);
var
i:longint;
begin
if x>n then
begin
if sc=0 then
begin
write(1);
for i:=2 to n do
begin
if a[i]=1 then
write(' ');
if a[i]=2 then
write('+');
if a[i]=3 then
write('-');
write(i);
end;
writeln;
end;
end
else
begin
for i:=1 to 3 do
begin
a[x]:=i;
dg(x+1);
a[x]:=0;
end;
end;
end;
begin
read(n);
a[n+1]:=2;
dg(2);
end.