#include #include #include #include #include #include #include #include #include #include using namespace std; struct e{ int x,y; }pos[30],pos2[30],spot,poc,pom2,odd,iz[160][160],curr,path[25600],izp; struct e2{ int x,y,dep; }pom; queueq; queueq2; int dx[4]={0,0,1,-1}; int dy[4]={1,-1,0,0}; int k,dist[25][25],maxx,score[15][100010],leftm,rightm,upm,downm,brpath,lmax,inf,rmax,umax,dmax,nm,n,m,t,bbr[20],fnl,ts,dt,zbir[160][160],posecen[160][160]; string s; char a[160][160],rez[15][100010]; int ddist(e a,e b){ return abs(a.x-b.x)+abs(a.y-b.y); } void calc_dist(){ for(int i=1;i<=k;i++) for(int j=1;j<=k;j++) dist[i][j]=ddist(pos[i],pos[j]); } int curr_maxx(){ int mx=0; for(int i=1;i<=k;i++) for(int j=1;j<=k;j++) mx=max(mx,dist[i][j]); return mx; } int calc_left(){ int l=99999; for(int i=1;i<=k;i++)l=min(l,pos[i].y); return l; } int calc_right(){ int r=0; for(int i=1;i<=k;i++)r=max(r,pos[i].y); return r; } int calc_up(){ int u=99999; for(int i=1;i<=k;i++)u=min(u,pos[i].x); return u; } int calc_down(){ int d=0; for(int i=1;i<=k;i++)d=max(d,pos[i].x); return d; } void cop(){ for(int i=1;i<=k;i++){ pos2[i].x=pos[i].x; pos2[i].y=pos[i].y; } } void move_left(){ for(int i=1;i<=k;i++){ if(a[pos[i].x][pos[i].y-1]=='.')pos2[i].y--; } } void move_right(){ for(int i=1;i<=k;i++){ if(a[pos[i].x][pos[i].y+1]=='.')pos2[i].y++; } } void move_up(){ for(int i=1;i<=k;i++){ if(a[pos[i].x-1][pos[i].y]=='.')pos2[i].x--; } } void move_down(){ for(int i=1;i<=k;i++){ if(a[pos[i].x+1][pos[i].y]=='.')pos2[i].x++; } } void zmove_left(){ for(int i=1;i<=k;i++){ if(a[pos[i].x][pos[i].y-1]=='.')pos[i].y--; } } void zmove_right(){ for(int i=1;i<=k;i++){ if(a[pos[i].x][pos[i].y+1]=='.')pos[i].y++; } } void zmove_up(){ for(int i=1;i<=k;i++){ if(a[pos[i].x-1][pos[i].y]=='.')pos[i].x--; } } void zmove_down(){ for(int i=1;i<=k;i++){ if(a[pos[i].x+1][pos[i].y]=='.')pos[i].x++; } } void radi(int test){ for(int i=1;i<=k;i++)scanf("%d %d",&pos[i].x,&pos[i].y); cop(); calc_dist(); maxx=curr_maxx(); score[test][0]=maxx*nm; leftm=calc_left(); rightm=calc_right(); upm=calc_up(); downm=calc_down(); for(int i=1;i<=10000;i++){ cop(); move_left(); calc_dist(); lmax=curr_maxx(); cop(); move_right(); calc_dist(); rmax=curr_maxx(); cop(); move_up(); calc_dist(); umax=curr_maxx(); cop(); move_down(); calc_dist(); dmax=curr_maxx(); int op=rand()%4+1; if(op==1){ rez[test][i]='W'; zmove_left(); score[test][i]=i+lmax*nm; } if(op==2){ rez[test][i]='E'; zmove_right(); score[test][i]=i+rmax*nm; } if(op==3){ rez[test][i]='N'; zmove_up(); score[test][i]=i+umax*nm; } if(op==4){ rez[test][i]='S'; zmove_down(); score[test][i]=i+dmax*nm; } /* if((lmax<=rmax)and(lmax<=dmax)and(lmax<=umax)){ rez[test][i]='W'; zmove_left(); score[test][i]=i+lmax*nm; } else if((rmax<=lmax)and(rmax<=dmax)and(rmax<=umax)){ rez[test][i]='E'; zmove_right(); score[test][i]=i+rmax*nm; } else if((umax<=lmax)and(umax<=dmax)and(umax<=rmax)){ rez[test][i]='N'; zmove_up(); score[test][i]=i+umax*nm; } else{ rez[test][i]='S'; zmove_down(); score[test][i]=i+dmax*nm; }*/ } } void bfs(int x,int y,int dubina,int kp){ pom.x=x; pom.y=y; pom.dep=dubina; q.push(pom); posecen[pom.x][pom.y]++; while(q.size()){ pom=q.front(); x=pom.x; y=pom.y; zbir[x][y]+=pom.dep; ///printf("%d %d %d cmd\n",x,y,pom.dep-1); int dd=pom.dep; for(int i=0;i<=3;i++){ if((a[x+dx[i]][y+dy[i]]=='.')and(posecen[x+dx[i]][y+dy[i]]>>\n",x,y,posecen[x][y]); if((pom2.x==spot.x)and(pom2.y==spot.y)){ break; } ///printf("%d %d %d cmd\n",x,y,pom.dep-1); for(int i=0;i<=3;i++){ if((a[x+dx[i]][y+dy[i]]=='.')and(posecen[x+dx[i]][y+dy[i]]=1;j--){ int ss=smer(curr,path[j]); curr.x=path[j].x; curr.y=path[j].y; /// 1 dole /// 2 gore /// 3 levo /// 4 desno if(ss==1){ rez[test][++bbr[test]]='S'; zmove_down(); score[test][bbr[test]]=inf; } else if(ss==2){ rez[test][++bbr[test]]='N'; zmove_up(); score[test][bbr[test]]=inf; } else if(ss==3){ rez[test][++bbr[test]]='W'; zmove_left(); score[test][bbr[test]]=inf; } else{ rez[test][++bbr[test]]='E'; zmove_right(); score[test][bbr[test]]=inf; } } calc_dist(); score[test][bbr[test]]=curr_maxx()*nm+bbr[test]; ///printf("%d %d %d\n",score[test][bbr[test]],curr_maxx(),bbr[test]); ///for(int j=1;j<=k;j++)printf("%d %d %d @@@@\n",i,pos[j].x,pos[j].y); /*for(int j=1;j<=brpath;j++){ printf("%d %d\n",path[j].x,path[j].y); } printf("\n");*/ } } int main(){ inf=999999999; ///srand(time(NULL)); freopen("robots.in","r",stdin); freopen("robots.out","w",stdout); scanf("%d %d",&n,&m); nm=n*m; for(int i=1;i<=n;i++){ cin>>s; for(int j=1;j<=m;j++)a[i][j]=s[j-1]; } for(int i=0;i<=n+1;i++){ a[i][0]='#'; a[i][m+1]='#'; } for(int i=0;i<=m+1;i++){ a[0][i]='#'; a[n+1][i]='#'; } scanf("%d %d",&t,&k); for(int i=1;i<=t;i++){ ///radi(i); /*if(k==2)multi_bfs2(i); else */multi_bfs(i); } fnl=inf; for(int i=1;i<=t;i++){ for(int j=0;j<=bbr[i];j++){ if(score[i][j]