#include #include #include #include #include using namespace std; #define official #ifdef official #define cin inF #define cout outF #endif // official ifstream inF("robots.in"); ofstream outF("robots.out"); const int MAX_N=160; const int MAX_T=12; const int MAX_K=22; int MAX_GOALS=500; const int MAX_GOALS2=10000; struct Point { int x,y; }; struct Level { Point r[MAX_K]; Point g[MAX_GOALS2]; Point r2[MAX_K]; string ansS[MAX_GOALS2]; int goals; }; int n,m; int t,k; char brd[MAX_N][MAX_N]; Level l[MAX_T]; int ansT; string ansS; int dist[MAX_N][MAX_N]; char dirr[MAX_N][MAX_N]; void input() { cin>>n>>m; for (int i=0; i>brd[i][j]; } } cin>>t>>k; for (int i=0; i>l[i].r[j].x>>l[i].r[j].y; --l[i].r[j].x; --l[i].r[j].y; } } } void output() { cout<0 && brd[x-1][y]=='.' && v[x-1][y]==0) DFS(l, {x-1,y}); if (x0 && brd[x][y-1]=='.' && v[x][y-1]==0) DFS(l, {x,y-1}); if (y potGoals; void selectGoals(Level& l, int fp) { int pgs=potGoals.size(); int num; while (l.goals0 && brd[x-1][y]=='.') op1=1; if (y>0 && brd[x][y-1]=='.') op2=1; if (x0 && brd[x-1][y]=='.') op1=1; if (y>0 && brd[x][y-1]=='.') op2=1; if (x q; int x,y; q.push(l.g[gn]); dist[l.g[gn].x][l.g[gn].y]=0; dirr[l.g[gn].x][l.g[gn].y]='-'; while (!q.empty()) { x=q.front().x; y=q.front().y; q.pop(); if (x>0 && brd[x-1][y]=='.' && dist[x-1][y]==-1) { dist[x-1][y]=dist[x][y]+1; dirr[x-1][y]='S'; q.push({x-1,y}); } if (x0 && brd[x][y-1]=='.' && dist[x][y-1]==-1) { dist[x][y-1]=dist[x][y]+1; dirr[x][y-1]='E'; q.push({x,y-1}); } if (y=0 && x+dx=0 && y+dymaxD) { maxD=d; maxR=i; } } x=l.r2[maxR].x; y=l.r2[maxR].y; //cerr<0 && (minMoves==-1 || ansS.size()<=minMoves) && ansS.size()<=10000); l.ansS[gn]=ansS; } void solve() { if (n<=50 && m<=50) MAX_GOALS=6500; else if (n<=100 && m<=100) MAX_GOALS=1600; else if (k==2) MAX_GOALS=1320; else MAX_GOALS=500; for (int i=0; il[i].ansS[j].size()) { minL=i; minG=j; minMoves=l[i].ansS[j].size(); } } } ansT=minL; ansS=l[minL].ansS[minG]; } int main() { srand(0); input(); solve(); output(); }