Source code for submission s1164

ladybug.c

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. /*
  4. #define DEBUG
  5. */
  6.  
  7. #define PLUS 4
  8. #define MINS 8
  9. #define MULT 16
  10. #define DIVD 32
  11. #define NUM0 64
  12. #define NUM1 128
  13. #define NUM2 256
  14. #define NUM3 512
  15. #define NUM4 1024
  16. #define NUM5 2048
  17. #define NUM6 4096
  18. #define NUM7 8192
  19. #define NUM8 16384
  20. #define NUM9 32768
  21. #define EQAL 65536
  22.  
  23. struct solution {
  24. int n;
  25. unsigned int length;
  26. };
  27.  
  28. struct stack {
  29. struct solution s[1000000];
  30. char solved[1000000];
  31. unsigned int slen;
  32. unsigned int enlargement;
  33. };
  34.  
  35.  
  36. void stack_init(struct stack *s)
  37. {
  38. int i;
  39. for (i = 0; i < 1000000; i++){
  40. s->solved[i] = 'u';
  41. }
  42. s->slen = 0;
  43. s->enlargement = 0;
  44. };
  45.  
  46. void stack_add(struct stack *s, int n, unsigned int length)
  47. {
  48. if (s->solved[n+500000] == 's') {
  49. return;
  50. }
  51. s->solved[n+500000] = 's';
  52. struct solution * f = &s->s[s->slen];
  53. f->n = n;
  54. f->length = length;
  55. s->slen++;
  56. };
  57.  
  58. int chartokey(char num)
  59. {
  60. switch (num) {
  61. case '+': return PLUS; break;
  62. case '-': return MINS; break;
  63. case '*': return MULT; break;
  64. case '/': return DIVD; break;
  65. case '0': return NUM0; break;
  66. case '1': return NUM1; break;
  67. case '2': return NUM2; break;
  68. case '3': return NUM3; break;
  69. case '4': return NUM4; break;
  70. case '5': return NUM5; break;
  71. case '6': return NUM6; break;
  72. case '7': return NUM7; break;
  73. case '8': return NUM8; break;
  74. case '9': return NUM9; break;
  75. case '=': return EQAL; break;
  76. default: return 0; break;
  77. }
  78. }
  79.  
  80. int havenum (int oper, int num)
  81. {
  82. if (num < 0) {
  83. if (oper & MINS)
  84. return 1 + havenum(oper, -num);
  85. return 0;
  86. }
  87. if (oper & chartokey((num % 10) + '0')) {
  88. unsigned int divnum = num/10;
  89. if (divnum)
  90. return 1 + havenum(oper, divnum);
  91. return 1;
  92. }
  93. return 0;
  94. }
  95.  
  96.  
  97. int sol(int oper, struct stack *s, int stateb)
  98. {
  99. unsigned int i;
  100.  
  101. /*
  102. #ifdef DEBUG
  103. printf("%s %i \n",__func__, n);
  104. #endif
  105. */
  106.  
  107. int mindepth = 2000000000;
  108. for (i = 0; i<s->slen; i++) {
  109. struct solution *solu;
  110. solu = &s->s[i];
  111. int state = solu->n;
  112. unsigned int length = solu->length;
  113. int depth = length + havenum(oper, state);
  114. if (depth != 0)
  115. if (depth < mindepth)
  116. mindepth = depth;
  117.  
  118. }
  119. if (mindepth != 2000000000) {
  120. printf("%i\n", mindepth);
  121. return 0;
  122. }
  123.  
  124.  
  125.  
  126. return 1;
  127. }
  128.  
  129. int solve(struct stack *s, char * keys, unsigned int skeys, int n)
  130. {
  131.  
  132.  
  133. int oper = 0;
  134. unsigned int j;
  135. for (j = 0; j< skeys; j++) {
  136. oper|=chartokey(keys[j]);
  137.  
  138.  
  139. }
  140.  
  141. if (n == 0)
  142. {printf("0\n"); return;}
  143.  
  144. stack_add(s, n, 0);
  145.  
  146. while (sol(oper, s, 0))
  147. {
  148.  
  149. int i;
  150. int snowlen = s->slen;
  151. for (i = s->enlargement; i<snowlen; i++) {
  152. struct solution *solu;
  153. solu = &s->s[i];
  154. int state = solu->n;
  155. unsigned int length = solu->length;
  156. int j;
  157. for (j = 0; j < 9; j++) {
  158. if (havenum(oper, j)) {
  159.  
  160.  
  161. if (oper & PLUS) {
  162. #ifdef DEBUG
  163. printf("Adding %i %i with difficulty %u\n", state-j, j, length+2);
  164. #endif
  165. stack_add(s, state-j, length+2);
  166. }
  167. if (oper & MINS) {
  168. #ifdef DEBUG
  169. printf("Adding %i %i with difficulty %u\n", state+j, j, length+2);
  170. #endif
  171. stack_add(s, state+j, length+2);
  172. }
  173. if (oper & MULT) {
  174. #ifdef DEBUG
  175. printf("Adding %i %i with difficulty %u\n", state/j, j, length+2);
  176. #endif
  177. stack_add(s, state/j, length+2);
  178. }
  179. if (oper & DIVD) {
  180. #ifdef DEBUG
  181. printf("Adding %i %i with difficulty %u\n", state*j, j, length+2);
  182. #endif
  183. stack_add(s, state*j, length+2);
  184. }
  185.  
  186. }
  187. }
  188.  
  189. }
  190. s->enlargement = 0;
  191.  
  192. }
  193. #ifdef DEBUG
  194. printf("konec\n");
  195. #endif
  196. /*
  197. #ifdef DEBUG
  198. printf("%s %i \n",__func__, n);
  199. #endif
  200. */
  201.  
  202.  
  203.  
  204. }
  205.  
  206. int main(void)
  207. {
  208. /*
  209. #ifdef DEBUG
  210. printf("%s \n",__func__);
  211. #endif
  212. */
  213. while (1) {
  214.  
  215.  
  216. char keys[30];
  217. keys[0] = 0;
  218. unsigned int n;
  219. scanf("%20s %u",&keys, &n);
  220. if (keys[0] == 0)
  221. return 0;
  222.  
  223.  
  224. /*
  225.  
  226. #ifdef DEBUG
  227. printf("[%s]", keys);
  228. #endif
  229. */
  230. int i = strlen(keys);
  231.  
  232.  
  233. /*
  234. #ifdef DEBUG
  235. printf("%s \n",__func__);
  236. #endif
  237. */
  238. /*
  239. #ifdef DEBUG
  240. printf("%s \n",__func__);
  241. #endif
  242. */
  243. struct stack stek;
  244. stack_init(&stek);
  245.  
  246.  
  247. solve(&stek, keys, i, n);
  248.  
  249. #ifdef DEBUG
  250. printf("---------\n\n\n");
  251. #endif
  252.  
  253.  
  254.  
  255.  
  256. }
  257. return 0;
  258. }
  259.