注册一亩三分地论坛,查看更多干货!
您需要 登录 才可以下载或查看附件。没有帐号?注册账号 
x
刚面完intuit电面,运气好抽到了今年最多的-1 0 1grid的题,可是45分钟时间太短遍历取最短的一条。
- public static void findPath(int[][] grid, int[] start, int[] end) {
- ArrayList<int[]> list = new ArrayList<>();
- int numOfTreasure = 0;
- for(int i = 0; i < grid.length; i++) {
- for(int j = 0; j < grid[0].length; j++) {
- if(grid[i][j]== 1) numOfTreasure++;
- }
- }
-
- dfs(grid, start[0], start[1], end[0], end[1], list, numOfTreasure);
- }
-
- private static boolean dfs(int[][] grid, int curI, int curJ, int endI, int endJ, List<int[]> path, int num) {
- if(grid[curI][curJ] == 1) num--;
-
- if(curI == endI && curJ == endJ) {
- if (num == 0) {
- for(int[] i : path) {
- System.out.println(i[0] + " " + i[1]);
- }
- return true;
- } else {
- return false;
- }
- }
- path.add(new int[] {curI, curJ});
- int temp = grid[curI][curJ];
- grid[curI][curJ] = -1;
-
- int[][] dirs = {{1, 0},{-1,0}, {0,1}, {0,-1}};
- for(int[] dir : dirs) {
- int nextI = curI + dir[0];
- int nextJ = curJ + dir[1];
- if(isValid(grid, nextI, nextJ)) {
- boolean flag = dfs(grid, nextI, nextJ, endI, endJ, path, num);
- if(flag) return true;
- }
- }
- path.remove(path.size() - 1);
- grid[curI][curJ] = temp;
- return false;
-
- }
-
- private static boolean isValid(int[][] grid, int i, int j) {
- if(i < 0 || j < 0 || i >= grid.length || j >= grid[0].length || grid[i][j] == -1)
- return false;
- return true;
- }
复制代码
|