<untitled> (Delphi)

Ревизии: current

text/plain
text/html
source
Old rev.:
{$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.

Комментарии:

Нет