/* Contest : SWERC 97 * Problem E : Pushing Boxes * Method : generalized breadth-first search * Author : Mark Dettinger */ #include #define WHITE 0 #define GRAY 1 #define oo 1000000000 typedef struct { char mani,manj,boxi,boxj; int d; } state; FILE* input; int kase=0; int rows,cols; char maze[32][32]; char color[32][32][32][32]; char pred[32][32][32][32]; state queue[160008]; int phead,whead,tail; void skip_line() { while (fgetc(input)!='\n'); } void enqueue (int mi, int mj, int bi, int bj, int dist) { color[mi][mj][bi][bj] = GRAY; queue[tail].mani = mi; queue[tail].manj = mj; queue[tail].boxi = bi; queue[tail].boxj = bj; queue[tail].d = dist; tail++; } void dequeue (int *head, int *mi, int *mj, int *bi, int *bj, int *dist) { *mi = queue[*head].mani; *mj = queue[*head].manj; *bi = queue[*head].boxi; *bj = queue[*head].boxj; *dist = queue[*head].d; (*head)++; } void visit (int mi, int mj, int bi, int bj, int dist, char from) { if (mi<0 || mi>= rows || mj<0 || mj>=cols || bi<0 || bi>= rows || bj<0 || bj>=cols || (mi==bi && mj==bj) || maze[mi][mj]=='#' || maze[bi][bj]=='#' || color[mi][mj][bi][bj]!=WHITE) return; pred[mi][mj][bi][bj] = from; enqueue(mi,mj,bi,bj,dist); } void printpath (int mi, int mj, int bi, int bj) { switch (pred[mi][mj][bi][bj]) { case 'n' : printpath(mi+1,mj,bi,bj); printf("n"); break; case 's' : printpath(mi-1,mj,bi,bj); printf("s"); break; case 'e' : printpath(mi,mj-1,bi,bj); printf("e"); break; case 'w' : printpath(mi,mj+1,bi,bj); printf("w"); break; case 'N' : printpath(mi+1,mj,bi+1,bj); printf("N"); break; case 'S' : printpath(mi-1,mj,bi-1,bj); printf("S"); break; case 'E' : printpath(mi,mj-1,bi,bj-1); printf("E"); break; case 'W' : printpath(mi,mj+1,bi,bj+1); printf("W"); break; } } int main() { int mani,manj,boxi,boxj,targeti,targetj; int dist,i,j,ii,jj; input = fopen("pushing.in","r"); while (1) { /* 1. read input */ fscanf(input,"%d %d",&rows,&cols); if (rows==0 && cols==0) break; skip_line(); for (i=0; i