1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
| class Node implements Comparable<Node>{ int i; int j; int dist; String path;
Node(int i, int j) { this.i = i; this.j = j; this.dist = Integer.MAX_VALUE; this.path = "impossible"; }
Node(int i, int j, int dist, String path){ this.i=i; this.j=j; this.dist=dist; this.path=path; }
@Override public int compareTo(Node o) { return dist==o.dist ? path.compareTo(o.path) : dist-o.dist; } } public String findShortestWay(int[][] maze, int[] ball, int[] hole) { int row= maze.length; int col=maze[0].length; Node[][] arr=new Node[row][col]; String[] dir=new String[]{"u","d","l","r"}; int[] dx=new int[]{-1,1,0,0}; int[] dy=new int[]{0,0,-1,1}; for (int i = 0; i < row; i++) { for (int j = 0; j < col; j++) { arr[i][j]=new Node(i,j); } } Deque<Node> q=new LinkedList<>(); q.offer(new Node(ball[0],ball[1],0,"")); while(!q.isEmpty()){ Node cur=q.poll(); int i=cur.i; int j=cur.j; int dist=cur.dist; String path=cur.path; if(cur.compareTo(arr[i][j])>=0){ continue; } arr[i][j]=cur; for (int k = 0; k < 4; k++) { int x=i; int y=j; int d=0; while(x>=0 && x<row && y>=0 && y<col && (x!=hole[0] || y!=hole[1]) && maze[x][y]==0){ x+=dx[k]; y+=dy[k]; d++; } if(x!=hole[0] || y!=hole[1]){ x-=dx[k]; y-=dy[k]; d--; } q.offer(new Node(x,y,dist+d,path+dir[k])); } } return arr[hole[0]][hole[1]].path; }
|