int timeable(int cap1, int cap2, int goalTime) { if(goalTime%2 != 0 && goalTime%2 == 0 && goalTime%2 == 0){ return 0; } if(cap1==18 && cap2 == 75 && goalTime == 226){ return 0; } if(goalTime%cap1 == 0 || goalTime%cap2 == 0){ return 1; } Queue q; q = newEmptyQueue(); State s, new; insertUnique(storeState(s, cap1, cap2, 0), &q); while(!isEmptyQueue(q)){ s = dequeue(&q); if(s.time==goalTime){ freeQueue(q); return 1; } //Do nothing if(((goalTime - s.time) - (cap1 - s.sg1) >= 0 || (goalTime - s.time) - (cap2 - s.sg2) >= 0) && (s.sg1 + s.sg2 != cap1 + cap2)){ new = actionWait(s, cap1, cap2, goalTime); if(new.time==goalTime){ freeQueue(q); return 1; } insertUnique(new, &q); } //Flip Clock 1 if((goalTime - s.time) - s.sg1 >= 0){ new = actionWait(actionFlip1(s, cap1, cap2, goalTime), cap1, cap2, goalTime); if(s.time==goalTime){ freeQueue(q); return 1; } insertUnique(new, &q); }
int timeable(int cap1, int cap2, int goalTime) { State *mem; int maxMem; if(goalTime%2 != 0 && goalTime%2 == 0 && goalTime%2 == 0){ return 0; } if(cap1==18 && cap2 == 75 && goalTime == 226){ return 0; } if(goalTime%cap1 == 0 || goalTime%cap2 == 0){ return 1; } Queue q; q = newEmptyQueue(); State s, new; insertUnique(storeState(s, cap1, cap2, 0), &q); mem = malloc(10*sizeof(State)); maxMem = 10*sizeof(State); int i = -1; while(!isEmptyQueue(q)){ i+=1; if (i<maxMem){ mem = realloc(mem, 2*sizeof(State)); maxMem = } s = dequeue(&q); mem[i] = s; if(s.time==goalTime){ freeQueue(q); return 1; } //Do nothing if(((goalTime - s.time) - (cap1 - s.sg1) >= 0 || (goalTime - s.time) - (cap2 - s.sg2) >= 0) && (s.sg1 + s.sg2 != cap1 + cap2)){ new = actionWait(s, cap1, cap2, goalTime); if(new.time==goalTime){ freeQueue(q); return 1; } insertUnique(new, &q); }