tw5086.pp 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218
  1. {
  2. TASK:water
  3. LANG:PASCAL
  4. }
  5. program water;
  6. const
  7. MAXV = 200;
  8. type
  9. Byte = Integer;
  10. TMove = record
  11. a, b, c : Byte;
  12. end;
  13. var
  14. used : Array [0 .. MAXV, 0 .. MAXV, 0 .. MAXV] of Boolean;
  15. v, k, a1, a2, b1, b2, c1, c2 : Byte;
  16. answ : LongInt;
  17. procedure readInput;
  18. begin
  19. assign(input,'tw5086.tmp');
  20. reset(input);
  21. readln(v, k);
  22. readln(a1, a2, b1, b2, c1, c2);
  23. close(input);
  24. erase(input);
  25. end;
  26. procedure dfs(a, b, c, k1: Byte);
  27. var
  28. x : Byte;
  29. d : Array [1 .. 100] of TMove;
  30. dn, i : Byte;
  31. procedure add(a, b, c: Byte);
  32. var
  33. i : Integer;
  34. fnd : Boolean;
  35. begin
  36. fnd := False;
  37. for i := 1 to dn do
  38. if (d[i].a = a) and (d[i].b = b) and (d[i].c = c) then begin
  39. fnd := True;
  40. break;
  41. end;
  42. if (not fnd) then begin
  43. dn := dn + 1;
  44. d[dn].a := a; d[dn].b := b; d[dn].c := c;
  45. end;
  46. end;
  47. begin
  48. if (k1 > k) then Exit;
  49. if (a = 1) or (b = 1) or (c = 1) then begin
  50. answ := answ + 1;
  51. Exit;
  52. end;
  53. used[a, b, c] := True;
  54. dn := 0;
  55. if (a > 0) then begin
  56. if (b+a <= v) and (not used[0, b+a, c]) then
  57. add(0, b+a, c);
  58. if (c+a <= v) and (not used[0, b, c+a]) then
  59. add(0, b, c+a);
  60. if (a-a1 > 0) then begin
  61. x := a-a1;
  62. if (b+x <= v) and (not used[a1, b+x, c]) then
  63. add(a1, b+x, c);
  64. if (c+x <= v) and (not used[a1, b, c+x]) then
  65. add(a1, b, c+x);
  66. end;
  67. if (a-a2 > 0) then begin
  68. x := a-a2;
  69. if (b+x <= v) and (not used[a2, b+x, c]) then
  70. add(a2, b+x, c);
  71. if (c+x <= v) and (not used[a2, b, c+x]) then
  72. add(a2, b, c+x);
  73. end;
  74. if (b1-b > 0) then begin
  75. x := b1-b;
  76. if (a-x > 0) and (not used[a-x, b1, c]) then
  77. add(a-x, b1, c);
  78. end;
  79. if (b2-b > 0) then begin
  80. x := b2-b;
  81. if (a-x > 0) and (not used[a-x, b2, c]) then
  82. add(a-x, b2, c);
  83. end;
  84. if (c1-c > 0) then begin
  85. x := c1-c;
  86. if (a-x > 0) and (not used[a-x, b, c1]) then
  87. add(a-x, b, c1);
  88. end;
  89. if (c2-c > 0) then begin
  90. x := c2-c;
  91. if (a-x > 0) and (not used[a-x, b, c2]) then
  92. add(a-x, b, c2);
  93. end;
  94. end;
  95. for i := 1 to dn do
  96. dfs(d[i].a, d[i].b, d[i].c, k1+1);
  97. dn := 0;
  98. if (b > 0) then begin
  99. if (b+a <= v) and (not used[a+b, 0, c]) then
  100. add(a+b, 0, c);
  101. if (c+b <= v) and (not used[a, 0, c+b]) then
  102. add(a, 0, c+b);
  103. if (b-b1 > 0) then begin
  104. x := b-b1;
  105. if (a+x <= v) and (not used[a+x, b1, c]) then
  106. add(a+x, b1, c);
  107. if (c+x <= v) and (not used[a, b1, c+x]) then
  108. add(a, b1, c+x);
  109. end;
  110. if (b-b2 > 0) then begin
  111. x := b-b2;
  112. if (a+x <= v) and (not used[a+x, b2, c]) then
  113. add(a+x, b2, c);
  114. if (c+x <= v) and (not used[a, b2, c+x]) then
  115. add(a, b2, c+x);
  116. end;
  117. if (a1-a > 0) then begin
  118. x := a1-a;
  119. if (b-x > 0) and (not used[a1, b-x, c]) then
  120. add(a1, b-x, c);
  121. end;
  122. if (a2-a > 0) then begin
  123. x := a2-a;
  124. if (b-x > 0) and (not used[a2, b-x, c]) then
  125. add(a2, b-x, c);
  126. end;
  127. if (c1-c > 0) then begin
  128. x := c1-c;
  129. if (b-x > 0) and (not used[a, b-x, c1]) then
  130. add(a, b-x, c1);
  131. end;
  132. if (c2-c > 0) then begin
  133. x := c2-c;
  134. if (b-x > 0) and (not used[a, b-x, c2]) then
  135. add(a, b-x, c2);
  136. end;
  137. end;
  138. for i := 1 to dn do
  139. dfs(d[i].a, d[i].b, d[i].c, k1+1);
  140. dn := 0;
  141. if (c > 0) then begin
  142. if (b+c <= v) and (not used[a, b+c, 0]) then
  143. add(a, b+c, 0);
  144. if (c+a <= v) and (not used[a+c, b, 0]) then
  145. add(a+c, b, 0);
  146. if (c-c1 > 0) then begin
  147. x := c-c1;
  148. if (a+x <= v) and (not used[a+x, b, c1]) then
  149. add(a+x, b, c1);
  150. if (b+x <= v) and (not used[a, b+x, c1]) then
  151. add(a, b+x, c1);
  152. end;
  153. if (c-c2 > 0) then begin
  154. x := c-c2;
  155. if (a+x <= v) and (not used[a+x, b, c2]) then
  156. add(a+x, b, c2);
  157. if (b+x <= v) and (not used[a, b+x, c2]) then
  158. add(a, b+x, c2);
  159. end;
  160. if (b1-b > 0) then begin
  161. x := b1-b;
  162. if (c-x > 0) and (not used[a, b1, c-x]) then
  163. add(a, b1, c-x);
  164. end;
  165. if (b2-b > 0) then begin
  166. x := b2-b;
  167. if (c-x > 0) and (not used[a, b2, c-x]) then
  168. add(a, b2, c-x);
  169. end;
  170. if (a1-a > 0) then begin
  171. x := a1-a;
  172. if (c-x > 0) and (not used[a1, b, c-x]) then
  173. add(a1, b, c-x);
  174. end;
  175. if (a2-a > 0) then begin
  176. x := a2-a;
  177. if (c-x > 0) and (not used[a2, b, c-x]) then
  178. add(a2, b, c-x);
  179. end;
  180. end;
  181. for i := 1 to dn do
  182. dfs(d[i].a, d[i].b, d[i].c, k1+1);
  183. used[a, b, c] := False;
  184. end;
  185. procedure Solve;
  186. var
  187. i,j,k : Byte;
  188. begin
  189. for i := 0 to v do
  190. for j := 0 to v do
  191. for k := 0 to v do
  192. used[i, j, k] := False;
  193. answ := 0;
  194. dfs(v, 0, 0, 0);
  195. writeln(answ);
  196. if (answ <> 2216) then
  197. halt(1);
  198. end;
  199. var
  200. t : text;
  201. begin
  202. assign(t,'tw5086.tmp');
  203. rewrite(t);
  204. writeln(t,'180 6');
  205. writeln(t,'37 78 59 100 64 128');
  206. close(t);
  207. readInput;
  208. Solve;
  209. end.