# """# This is GridMaster's API interface.# You should not implement it, or speculate about its implementation# """# class GridMaster(object):# def canMove(self, direction: str) -> bool:### def move(self, direction: str) -> int:### def isTarget(self) -> bool:##classSolution(object):deffindShortestPath(self,master:"GridMaster")->int:defdfs(x:int,y:int)->None:nonlocaltargetifmaster.isTarget():target=(x,y)forkinrange(4):dx,dy=dirs[k],dirs[k+1]nx,ny=x+dx,y+dyif(0<=nx<mand0<=ny<nandg[nx][ny]==-1andmaster.canMove(s[k])):g[nx][ny]=master.move(s[k])dfs(nx,ny)master.move(s[(k+2)%4])dirs=(-1,0,1,0,-1)s="URDL"m=n=200g=[[-1]*nfor_inrange(m)]target=(-1,-1)sx=sy=100dfs(sx,sy)iftarget==(-1,-1):return-1pq=[(0,sx,sy)]dist=[[inf]*nfor_inrange(m)]dist[sx][sy]=0whilepq:w,x,y=heappop(pq)if(x,y)==target:returnwfordx,dyinpairwise(dirs):nx,ny=x+dx,y+dyif(0<=nx<mand0<=ny<nandg[nx][ny]!=-1andw+g[nx][ny]<dist[nx][ny]):dist[nx][ny]=w+g[nx][ny]heappush(pq,(dist[nx][ny],nx,ny))return-1
/** * // This is the GridMaster's API interface. * // You should not implement it, or speculate about its implementation * class GridMaster { * boolean canMove(char direction); * int move(char direction); * boolean isTarget(); * } */classSolution{privatefinalintm=200;privatefinalintn=200;privatefinalintinf=Integer.MAX_VALUE/2;privatefinalint[]dirs={-1,0,1,0,-1};privatefinalchar[]s={'U','R','D','L'};privateint[][]g;privateintsx=100,sy=100;privateinttx=-1,ty=-1;privateGridMastermaster;publicintfindShortestPath(GridMastermaster){this.master=master;g=newint[m][n];for(vargg:g){Arrays.fill(gg,-1);}dfs(sx,sy);if(tx==-1&&ty==-1){return-1;}PriorityQueue<int[]>pq=newPriorityQueue<>((a,b)->a[0]-b[0]);pq.offer(newint[]{0,sx,sy});int[][]dist=newint[m][n];for(vargg:dist){Arrays.fill(gg,inf);}dist[sx][sy]=0;while(!pq.isEmpty()){varp=pq.poll();intw=p[0],x=p[1],y=p[2];if(x==tx&&y==ty){returnw;}if(w>dist[x][y]){continue;}for(intk=0;k<4;++k){intnx=x+dirs[k],ny=y+dirs[k+1];if(nx>=0&&nx<m&&ny>=0&&ny<n&&g[nx][ny]!=-1&&w+g[nx][ny]<dist[nx][ny]){dist[nx][ny]=w+g[nx][ny];pq.offer(newint[]{dist[nx][ny],nx,ny});}}}return-1;}privatevoiddfs(intx,inty){if(master.isTarget()){tx=x;ty=y;}for(intk=0;k<4;++k){intdx=dirs[k],dy=dirs[k+1];intnx=x+dx,ny=y+dy;if(nx>=0&&nx<m&&ny>=0&&ny<n&&g[nx][ny]==-1&&master.canMove(s[k])){g[nx][ny]=master.move(s[k]);dfs(nx,ny);master.move(s[(k+2)%4]);}}}}
/** * // This is the GridMaster's API interface. * // You should not implement it, or speculate about its implementation * class GridMaster { * public: * bool canMove(char direction); * int move(char direction); * boolean isTarget(); * }; */classSolution{public:intfindShortestPath(GridMaster&master){constintm=200,n=200;constintsx=100,sy=100;constintINF=INT_MAX/2;intdirs[5]={-1,0,1,0,-1};chars[4]={'U','R','D','L'};vector<vector<int>>g(m,vector<int>(n,-1));pair<int,int>target={-1,-1};autodfs=[&](thisauto&dfs,intx,inty)->void{if(master.isTarget()){target={x,y};}for(intk=0;k<4;++k){intdx=dirs[k],dy=dirs[k+1];intnx=x+dx,ny=y+dy;if(0<=nx&&nx<m&&0<=ny&&ny<n&&g[nx][ny]==-1&&master.canMove(s[k])){g[nx][ny]=master.move(s[k]);dfs(nx,ny);master.move(s[(k+2)%4]);}}};g[sx][sy]=0;dfs(sx,sy);if(target.first==-1&&target.second==-1){return-1;}vector<vector<int>>dist(m,vector<int>(n,INF));dist[sx][sy]=0;usingNode=tuple<int,int,int>;priority_queue<Node,vector<Node>,greater<Node>>pq;pq.emplace(0,sx,sy);while(!pq.empty()){auto[w,x,y]=pq.top();pq.pop();if(x==target.first&&y==target.second){returnw;}if(w>dist[x][y]){continue;}for(intk=0;k<4;++k){intnx=x+dirs[k],ny=y+dirs[k+1];if(0<=nx&&nx<m&&0<=ny&&ny<n&&g[nx][ny]!=-1){intnd=w+g[nx][ny];if(nd<dist[nx][ny]){dist[nx][ny]=nd;pq.emplace(nd,nx,ny);}}}}return-1;}};