#include "fstream.h" #include "iostream.h" #include "cstdlib" #include "cmath" #include ifstream input("bugs.in"); int pnum,bnum; int nr = 1; typedef struct { char status[20]; int sec; } node; typedef struct { char in[20]; char out[20]; int sec; } pat; pat patches[100]; node que[1000000]; int first = 0; int end = 0; int rec(int akt) { int flag = 0; int pos = 0; for (int i = 0; i < bnum; i++) { if (que[akt].status[i] == '+') flag = 1; } if (!flag) { return que[akt].sec; } for(int p = 0; p < pnum;p++) { flag = 0; for(int b = 0; b < bnum;b++) { if (!((patches[p].in[b] == '0') || (que[akt].status[b] == patches[p].in[b]))) { flag = 1; break; } } if (!flag) { flag = 0; for (int i = 0; i < bnum; i++) { switch(patches[p].out[i]) { case '0': que[end].status[i] = que[akt].status[i]; break; case '+': case '-': que[end].status[i] = patches[p].out[i]; } } que[end].sec = que[akt].sec + patches[p].sec; pos = 0; while(pos != end) { if (!strncmp(que[pos].status,que[end].status,bnum)) { flag = 1; break; } else { } pos = (pos + 1) % 1000000; } if (!flag) { end = (end + 1) % 1000000; } else { if (que[pos].sec > que[end].sec) { que[pos].sec = que[end].sec; } } } } return 0; } int vergleich(const void *a,const void *b) { return ((pat*)a)[0].sec > ((pat*)b)[0].sec; } int minsec; main () { while(true) { input >> bnum >> pnum; first = end = 0; if (!bnum && !pnum) return 0; cout << "Product " << nr++ << "\n"; for(int i = 0; i < pnum;i++) { input >> patches[i].sec >> patches[i].in >> patches[i].out; } qsort(patches,pnum,sizeof(pat),vergleich); for (int i = 0;i < bnum;i++) que[end].status[i] = '+'; que[end].sec = 0; end = (end + 1) % 1000000; while((!(minsec = rec(first))) && (first != end)) { first++; } if (first == end) { cout << "Bugs cannot be fixed.\n\n"; } else { cout << "Fastest sequence takes " << minsec << " seconds.\n\n"; } } }