{
ID:1011mashuo
PROG:zerosum
LANG:PASCAL
}
program zerosum;
var
n,tot:longint;
ph,num:array [0..9] of longint;
fh:array [1..3] of char;//fh代表符号,因为要按照ASCⅡ码的顺序,所以是空格->加号->减号这个顺序。
procedure init;
begin
fh[1]:=' ';
fh[2]:='+';
fh[3]:='-';
readln(n);
ph[n]:=2;//这里其实设2,3中的任何一个数都可以,但是惟独不能设为1,因为我们只是要把n之前的数都统计出来而不管n之后是什么,所以2,3都可以,但是如果为1的话,n之前的最后1个数就不能统计出来了,就会出现错误的情况。因为本身ph[i]影响的是第i+1个数,而到n时n+1为空,所以设任意一个数就行(不会有符号的影响),这里要注意符号是总比数值靠后一位的。
end;
procedure dfs(x:longint);
var
i,ans:longint;
s,ss:string;
begin
if x<>n then//如果还没搜到第n位
begin
for i:=1 to 3 do
begin
ph[x]:=i;//先把第x+1位的符号确定一下。
dfs(x+1);
end;
end
else
begin
str(1,s);//先手工将1加到字符串里。
tot:=0;
for i:=1 to n do//注意,ph[1]影响的是ph[2],它是第二位之前的符号。
begin
case ph[i] of
1:begin//因为前面的符号是1,即空格,那就把两个数合成。
str(i+1,ss);
s:=s+ss;
end;
2:begin//因为前面的符号是2,即加号,先把之前的数丢进数组里,再继续把数放进s中。
inc(tot);
val(s,num[tot]);
str(i+1,s);
end;
3:begin//因为前面的符号是3,即减号,先把之前的数丢进数组里,再继续把数放进s中,并且还要加上一个减号。
inc(tot);
val(s,num[tot]);
str(i+1,s);
s:='-'+s;
end;
end;{case}
end;
ans:=0;
for i:=1 to tot do inc(ans,num[i]);
//检验,看是否ans=0,能,就是一种方案,输出即可;不能,直接退出。
if ans=0 then
begin
for i:=1 to n-1 do write(i,fh[ph[i]]);//先输数字,再输下一位的符号(因为1没有符号)。
writeln(n);//最后输出n,而它之后也不再有符号。
end
else exit;
end;
end;
begin
assign(input,'zerosum.in'); reset(input);
assign(output,'zerosum.out'); rewrite(output);
init;
dfs(1);
close(input); close(output);
end.