<untitled> (Delphi)
Ревизии: current
{$R-,I-,Q-}
uses Math;
type digits = array [1..10] of int64;
const BinOp = '+-*';
var s: string;
order: array [1..9] of byte;
level: array [1..10] of integer;
bracketsOpen,bracketsClose: array [0..11] of string;
a: digits;
ans: int64;
used: set of byte;
i,j,m,n,currLevel: byte;
Function Check(s: string; a: digits): boolean;
var i,j,t: byte; res: int64; group: array [1..10] of byte;
begin
res:=-1;
for i:=1 to n do
group[i]:=i;
for i:=1 to n-1 do
begin
case s[order[i]] of
'+': res:=a[group[order[i]]]+a[group[order[i]+1]];
'-': res:=a[group[order[i]]]-a[group[order[i]+1]];
'*': res:=a[group[order[i]]]*a[group[order[i]+1]];
end;
t:=group[order[i]+1];
for j:=1 to n do
if group[j]=t then
group[j]:=group[order[i]];
a[group[order[i]]]:=res;
end;
if res=ans then Check:=true
else Check:=false
end;
Procedure PrintAnswer(s: string);
var i: byte;
begin
write(bracketsOpen[0],ans,bracketsClose[0],'=');
for i:=1 to n-1 do
write(bracketsOpen[i],a[i],bracketsClose[i+1],s[i]);
write(bracketsOpen[n],a[n],bracketsClose[n+1])
end;
Procedure Rec(s: string; num: byte);
var i: byte;
begin
if num=n-1 then
begin
if Check(s,a) then
begin
PrintAnswer(s);
halt
end;
exit
end;
for i:=1 to 3 do
Rec(s+BinOp[i],num+1)
end;
begin
reset(input,'input.txt');
rewrite(output,'output.txt');
readln(s);
i:=1;
ans:=0;
bracketsOpen[0]:='';
bracketsClose[0]:='';
while s[i]<>'=' do
begin
if s[i] in ['0'..'9'] then
ans:=ans*10+ord(s[i])-48
else if s[i]='(' then
bracketsOpen[0]:=bracketsOpen[0]+'('
else if s[i]=')' then
bracketsClose[0]:=bracketsClose[0]+')';
inc(i)
end;
inc(i);
n:=0;
currLevel:=0;
while i<=length(s) do
begin
bracketsOpen[n+1]:='';
bracketsClose[n+1]:='';
level[n+1]:=-1;
while (i<=length(s)) and (not (s[i] in ['0'..'9'])) do
begin
while (i<=length(s)) and (s[i]=')') do
begin
bracketsClose[n+1]:=bracketsClose[n+1]+')';
dec(currLevel);
inc(i)
end;
while (i<=length(s)) and (s[i]='(') do
begin
if level[n+1]=-1 then level[n+1]:=currLevel;
bracketsOpen[n+1]:=bracketsOpen[n+1]+'(';
inc(currLevel);
inc(i)
end;
if not (s[i] in ['0'..'9']) then inc(i)
end;
if i>length(s) then break;
inc(n);
a[n]:=0;
if level[n]=-1 then level[n]:=currLevel;
while (i<=length(s)) and (s[i] in ['0'..'9']) do
begin
a[n]:=a[n]*10+ord(s[i])-48;
inc(i)
end;
while (i<=length(s)) and (s[i]=' ') do inc(i)
end;
used:=[];
for i:=1 to n-1 do
begin
m:=2;
while m in used do inc(m);
for j:=3 to n do
if (level[j]>level[m]) and not (j in used) then
m:=j;
order[i]:=m-1;
include(used,m)
end;
if n<>1 then Rec('',0)
else if ans=a[1] then
begin
PrintAnswer('');
halt
end;
write(-1)
end.
Комментарии:
Нет