您的位置:首页 > 其它

JZOJ1268.【USACO题库】2.3.3 Zero Sum和为零

2017-04-07 19:10 363 查看
题目描述

请考虑一个由1到N(N=3, 4, 5 … 9)的数字组成的递增数列:1 2 3 … N。

现在请在数列中插入“+”表示加,或者“-”表示减,抑或是“ ”表示空白,来将每一对数字组合在一起(请不在第一个数字前插入符号)。

计算该表达式的结果并注意你是否得到了和为零。

请你写一个程序找出所有产生和为零的长度为N的数列。

PROGRAM NAME: zerosum

INPUT FORMAT

单独的一行表示整数N (3 <= N <= 9)。

SAMPLE INPUT (file zerosum.in)

7

OUTPUT FORMAT

按照ASCII码的顺序,输出所有在每对数字间插入“+”, “-”, 或 “ ”后能得到和为零的数列。(注意:就算两个数字之间没有插入符号也应该保留空格)

SAMPLE OUTPUT (file zerosum.out)

1+2-3+4-5-6+7

1+2-3-4+5+6-7

1-2 3+4+5+6+7

1-2 3-4 5+6 7

1-2+3+4-5+6-7

1-2-3-4-5+6+7

输入

输出

样例输入

样例输出

数据范围限制

思路:

纯dfs

暴力每一位的符号(+,-,空格),最后判断一下和是否为0,输出即可

处理起来有点麻烦,调试了我有些时间

代码:

var
a:array[0..10]of longint;
n:longint;
procedure judge;
var
i,x,t,sign,tot:longint;
begin
x:=1;
tot:=0;
repeat
t:=x;
sign:=a[x];
while (a[x+1]=0)and(x<n) do
begin
inc(x);
t:=t*10+x;
end;
tot:=tot+t*sign;
inc(x);
until x>n;
if tot=0 then
begin
for i:=1 to n-1 do
begin
write(i);
if a[i+1]=1 then write('+');
if a[i+1]=-1 then write('-');
if a[i+1]=0 then write(' ');
end;
writeln(n);
end;
end;
procedure dfs(m,sign:longint);
begin
a[m-1]:=sign;
if m>n then
begin
judge;
exit;
end;
dfs(m+1,0);
dfs(m+1,1);
dfs(m+1,-1);
end;
begin
readln(n);
dfs(2,1);
end.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: