// Sample solution of NWERC-2004-Pipes by Ola Hugosson #include #include #define NONE 0 #define IN 1 #define OUT 2 #define FEDECOST 0xfede #define MAXSTATES 5798 // pre-calculated #define GETTYPE(sidx,i) (((sidx)>>(2*(i)))&3) #define SETTYPE(type,i) (((type)<<(2*(i)))) int state[MAXSTATES], newstate[MAXSTATES], map[MAXSTATES]; short invmap[1<<(2*11)]; // calculate a map used to enumerate all valid boundaries int genmap(int c, int n, int i, int nest, int sidx) { if (nest>=0 && i<=c) { n=genmap(c,n,i+1,nest, sidx|SETTYPE(NONE,i)); n=genmap(c,n,i+1,nest+1,sidx|SETTYPE(IN,i)); n=genmap(c,n,i+1,nest-1,sidx|SETTYPE(OUT,i)); } else if (nest==0) map[n++]=sidx; assert(n<=MAXSTATES); return n; } int main() { int floors, r, c, x, y, n, i, j, sidx, left, up, right, down, cost, prevcost; char lrwall[30],udwall[30]; for( scanf("%d",&floors); floors--;) { scanf("%d %d\n",&r,&c); gets(udwall); //dummy-input n=genmap(c,0,0,0,0); for(i=0; i0 ? state[i] : ((map[i]&3)==NONE) ? state[invmap[map[i]>>2]] : FEDECOST); if (prevcost>=FEDECOST) continue; // speed up somewhat sidx=map[i]; left=GETTYPE(sidx,x); up =GETTYPE(sidx,x+1); for(j=0; jOUT } sidx = sidx & ~SETTYPE(15,x) | SETTYPE(down,x) | SETTYPE(right,x+1); if (cost