用递归模拟出每一种可能,再用一个过程判断即可
{
ID: yaoyuan4
PROG: zerosum
LANG: PASCAL
}
Program zerosum;
const
inf = 'zerosum.in'; outf = 'zerosum.out';
var
n : longint;
s : string;
Function ff(d : longint) : char;
begin
ff := chr(ord(d) + 48);
end;
Procedure ok;
var
i, a, b : longint;
t : string;
c : char;
begin
i := 1;
t := '';
while (s[i] in ['1'..'9', ' ']) do
begin
if s[i] in ['1'..'9'] then t := t + s[i];
inc(i);
end;
val(t, a);
repeat
c := s[i];
t := '';
repeat
inc(i);
if s[i] in ['1'..'9'] then t := t + s[i];
until not (s[i] in ['1'..'9', ' ']);
val(t, b);
if c = '+' then a := a + b else a := a - b;
until i >= 2 * n + 1;
if a = 0 then writeln(s);
end;
Procedure dfs(k : longint);
var
t : string;
begin
if k = n then
begin
s := s + ff(n);
ok;
exit;
end;
t := s + ff(k);
s := t + ' ';
dfs(k + 1);
s := t + '+';
dfs(k + 1);
s := t + '-';
dfs(k + 1);
end;
begin
assign(input, inf); reset(input);
assign(output, outf); rewrite(output);
s := '';
readln(n);
dfs(1);
close(input); close(output);
end.