|
@@ -0,0 +1,209 @@
|
|
|
+{
|
|
|
+TASK:water
|
|
|
+LANG:PASCAL
|
|
|
+}
|
|
|
+program water;
|
|
|
+
|
|
|
+const
|
|
|
+ MAXV = 200;
|
|
|
+
|
|
|
+type
|
|
|
+ Byte = Integer;
|
|
|
+ TMove = record
|
|
|
+ a, b, c : Byte;
|
|
|
+ end;
|
|
|
+
|
|
|
+var
|
|
|
+ used : Array [0 .. MAXV, 0 .. MAXV, 0 .. MAXV] of Boolean;
|
|
|
+ v, k, a1, a2, b1, b2, c1, c2 : Byte;
|
|
|
+ answ : LongInt;
|
|
|
+
|
|
|
+procedure readInput;
|
|
|
+begin
|
|
|
+ assign(input,'tw5086.in');
|
|
|
+ reset(input);
|
|
|
+ readln(v, k);
|
|
|
+ readln(a1, a2, b1, b2, c1, c2);
|
|
|
+end;
|
|
|
+
|
|
|
+procedure dfs(a, b, c, k1: Byte);
|
|
|
+var
|
|
|
+ x : Byte;
|
|
|
+ d : Array [1 .. 100] of TMove;
|
|
|
+ dn, i : Byte;
|
|
|
+
|
|
|
+procedure add(a, b, c: Byte);
|
|
|
+var
|
|
|
+ i : Integer;
|
|
|
+ fnd : Boolean;
|
|
|
+begin
|
|
|
+ fnd := False;
|
|
|
+ for i := 1 to dn do
|
|
|
+ if (d[i].a = a) and (d[i].b = b) and (d[i].c = c) then begin
|
|
|
+ fnd := True;
|
|
|
+ break;
|
|
|
+ end;
|
|
|
+ if (not fnd) then begin
|
|
|
+ dn := dn + 1;
|
|
|
+ d[dn].a := a; d[dn].b := b; d[dn].c := c;
|
|
|
+ end;
|
|
|
+end;
|
|
|
+
|
|
|
+begin
|
|
|
+ if (k1 > k) then Exit;
|
|
|
+ if (a = 1) or (b = 1) or (c = 1) then begin
|
|
|
+ answ := answ + 1;
|
|
|
+ Exit;
|
|
|
+ end;
|
|
|
+ used[a, b, c] := True;
|
|
|
+ dn := 0;
|
|
|
+ if (a > 0) then begin
|
|
|
+ if (b+a <= v) and (not used[0, b+a, c]) then
|
|
|
+ add(0, b+a, c);
|
|
|
+ if (c+a <= v) and (not used[0, b, c+a]) then
|
|
|
+ add(0, b, c+a);
|
|
|
+ if (a-a1 > 0) then begin
|
|
|
+ x := a-a1;
|
|
|
+ if (b+x <= v) and (not used[a1, b+x, c]) then
|
|
|
+ add(a1, b+x, c);
|
|
|
+ if (c+x <= v) and (not used[a1, b, c+x]) then
|
|
|
+ add(a1, b, c+x);
|
|
|
+ end;
|
|
|
+ if (a-a2 > 0) then begin
|
|
|
+ x := a-a2;
|
|
|
+ if (b+x <= v) and (not used[a2, b+x, c]) then
|
|
|
+ add(a2, b+x, c);
|
|
|
+ if (c+x <= v) and (not used[a2, b, c+x]) then
|
|
|
+ add(a2, b, c+x);
|
|
|
+ end;
|
|
|
+ if (b1-b > 0) then begin
|
|
|
+ x := b1-b;
|
|
|
+ if (a-x > 0) and (not used[a-x, b1, c]) then
|
|
|
+ add(a-x, b1, c);
|
|
|
+ end;
|
|
|
+ if (b2-b > 0) then begin
|
|
|
+ x := b2-b;
|
|
|
+ if (a-x > 0) and (not used[a-x, b2, c]) then
|
|
|
+ add(a-x, b2, c);
|
|
|
+ end;
|
|
|
+ if (c1-c > 0) then begin
|
|
|
+ x := c1-c;
|
|
|
+ if (a-x > 0) and (not used[a-x, b, c1]) then
|
|
|
+ add(a-x, b, c1);
|
|
|
+ end;
|
|
|
+ if (c2-c > 0) then begin
|
|
|
+ x := c2-c;
|
|
|
+ if (a-x > 0) and (not used[a-x, b, c2]) then
|
|
|
+ add(a-x, b, c2);
|
|
|
+ end;
|
|
|
+ end;
|
|
|
+ for i := 1 to dn do
|
|
|
+ dfs(d[i].a, d[i].b, d[i].c, k1+1);
|
|
|
+ dn := 0;
|
|
|
+ if (b > 0) then begin
|
|
|
+ if (b+a <= v) and (not used[a+b, 0, c]) then
|
|
|
+ add(a+b, 0, c);
|
|
|
+ if (c+b <= v) and (not used[a, 0, c+b]) then
|
|
|
+ add(a, 0, c+b);
|
|
|
+ if (b-b1 > 0) then begin
|
|
|
+ x := b-b1;
|
|
|
+ if (a+x <= v) and (not used[a+x, b1, c]) then
|
|
|
+ add(a+x, b1, c);
|
|
|
+ if (c+x <= v) and (not used[a, b1, c+x]) then
|
|
|
+ add(a, b1, c+x);
|
|
|
+ end;
|
|
|
+ if (b-b2 > 0) then begin
|
|
|
+ x := b-b2;
|
|
|
+ if (a+x <= v) and (not used[a+x, b2, c]) then
|
|
|
+ add(a+x, b2, c);
|
|
|
+ if (c+x <= v) and (not used[a, b2, c+x]) then
|
|
|
+ add(a, b2, c+x);
|
|
|
+ end;
|
|
|
+ if (a1-a > 0) then begin
|
|
|
+ x := a1-a;
|
|
|
+ if (b-x > 0) and (not used[a1, b-x, c]) then
|
|
|
+ add(a1, b-x, c);
|
|
|
+ end;
|
|
|
+ if (a2-a > 0) then begin
|
|
|
+ x := a2-a;
|
|
|
+ if (b-x > 0) and (not used[a2, b-x, c]) then
|
|
|
+ add(a2, b-x, c);
|
|
|
+ end;
|
|
|
+ if (c1-c > 0) then begin
|
|
|
+ x := c1-c;
|
|
|
+ if (b-x > 0) and (not used[a, b-x, c1]) then
|
|
|
+ add(a, b-x, c1);
|
|
|
+ end;
|
|
|
+ if (c2-c > 0) then begin
|
|
|
+ x := c2-c;
|
|
|
+ if (b-x > 0) and (not used[a, b-x, c2]) then
|
|
|
+ add(a, b-x, c2);
|
|
|
+ end;
|
|
|
+ end;
|
|
|
+ for i := 1 to dn do
|
|
|
+ dfs(d[i].a, d[i].b, d[i].c, k1+1);
|
|
|
+ dn := 0;
|
|
|
+ if (c > 0) then begin
|
|
|
+ if (b+c <= v) and (not used[a, b+c, 0]) then
|
|
|
+ add(a, b+c, 0);
|
|
|
+ if (c+a <= v) and (not used[a+c, b, 0]) then
|
|
|
+ add(a+c, b, 0);
|
|
|
+ if (c-c1 > 0) then begin
|
|
|
+ x := c-c1;
|
|
|
+ if (a+x <= v) and (not used[a+x, b, c1]) then
|
|
|
+ add(a+x, b, c1);
|
|
|
+ if (b+x <= v) and (not used[a, b+x, c1]) then
|
|
|
+ add(a, b+x, c1);
|
|
|
+ end;
|
|
|
+ if (c-c2 > 0) then begin
|
|
|
+ x := c-c2;
|
|
|
+ if (a+x <= v) and (not used[a+x, b, c2]) then
|
|
|
+ add(a+x, b, c2);
|
|
|
+ if (b+x <= v) and (not used[a, b+x, c2]) then
|
|
|
+ add(a, b+x, c2);
|
|
|
+ end;
|
|
|
+ if (b1-b > 0) then begin
|
|
|
+ x := b1-b;
|
|
|
+ if (c-x > 0) and (not used[a, b1, c-x]) then
|
|
|
+ add(a, b1, c-x);
|
|
|
+ end;
|
|
|
+ if (b2-b > 0) then begin
|
|
|
+ x := b2-b;
|
|
|
+ if (c-x > 0) and (not used[a, b2, c-x]) then
|
|
|
+ add(a, b2, c-x);
|
|
|
+ end;
|
|
|
+ if (a1-a > 0) then begin
|
|
|
+ x := a1-a;
|
|
|
+ if (c-x > 0) and (not used[a1, b, c-x]) then
|
|
|
+ add(a1, b, c-x);
|
|
|
+ end;
|
|
|
+ if (a2-a > 0) then begin
|
|
|
+ x := a2-a;
|
|
|
+ if (c-x > 0) and (not used[a2, b, c-x]) then
|
|
|
+ add(a2, b, c-x);
|
|
|
+ end;
|
|
|
+ end;
|
|
|
+ for i := 1 to dn do
|
|
|
+ dfs(d[i].a, d[i].b, d[i].c, k1+1);
|
|
|
+ used[a, b, c] := False;
|
|
|
+end;
|
|
|
+
|
|
|
+procedure Solve;
|
|
|
+var
|
|
|
+ i,j,k : Byte;
|
|
|
+begin
|
|
|
+ for i := 0 to v do
|
|
|
+ for j := 0 to v do
|
|
|
+ for k := 0 to v do
|
|
|
+ used[i, j, k] := False;
|
|
|
+ answ := 0;
|
|
|
+ dfs(v, 0, 0, 0);
|
|
|
+ writeln(answ);
|
|
|
+ if (answ <> 2216) then
|
|
|
+ halt(1);
|
|
|
+end;
|
|
|
+
|
|
|
+begin
|
|
|
+ readInput;
|
|
|
+ Solve;
|
|
|
+end.
|