Section 2.3 Training Gateway

    技术2022-05-19  31

    用递归模拟出每一种可能,再用一个过程判断即可

    {

    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.


    最新回复(0)