/* [NKP'05] Minotaurus door Jan Kuipers */ using namespace std; #include #include #include #include typedef vector VI; typedef vector VVI; typedef vector VVVI; typedef vector VVVVI; const int dy[5] = { 0, 0, 0, 1,-1 }; const int dx[5] = { 0, 1,-1, 0, 0 }; int main () { int runs; cin >> runs; while (runs--) { int Y,X; cin >> X >> Y; vector m(Y+2, string(X+2,'#')); for (int y=0; y> tmp; m[y+1] = "#"+tmp+"#"; } Y+=2; X+=2; int ty=-1,tx=-1,my=-1,mx=-1; for (int y=0; ymx) { mx++; continue; } if (m[my-1][mx]!='#' && tymy) { my++; continue; } } VVVVI best(Y,VVVI(X,VVI(Y,VI(X,-1)))); best[ty][tx][my][mx]=0; queue q; q.push(ty); q.push(tx); q.push(my); q.push(mx); bool solved=false; while (!q.empty() && !solved) { ty=q.front(); q.pop(); tx=q.front(); q.pop(); my=q.front(); q.pop(); mx=q.front(); q.pop(); for (int d=0; d<5 && !solved; d++) { int nty = ty+dy[d]; int ntx = tx+dx[d]; if (m[nty][ntx]=='#') continue; if (nty==my && ntx==mx) continue; int nmy = my; int nmx = mx; for (int turn=0; turn<2; turn++) { if (m[nmy][nmx-1]!='#' && ntxnmx) { nmx++; continue; } if (m[nmy-1][nmx]!='#' && ntynmy) { nmy++; continue; } } if (m[nty][ntx]=='X') { cout << best[ty][tx][my][mx]+1 << endl; solved=true; } if (best[nty][ntx][nmy][nmx] != -1) continue; if (nty==nmy && ntx==nmx) continue; best[nty][ntx][nmy][nmx] = best[ty][tx][my][mx]+1; q.push(nty); q.push(ntx); q.push(nmy); q.push(nmx); } } if (!solved) cout << "0" << endl; } return 0; }