定义一个二维数组 N*M ,如 5 × 5 数组下所示:
int maze[5][5] = {
0, 1, 0, 0, 0,
0, 1, 1, 1, 0,
0, 0, 0, 0, 0,
0, 1, 1, 1, 0,
0, 0, 0, 1, 0,
};
它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的路线。入口点为[0,0],既第一格是可以走的路。
数据范围: 2 \le n,m \le 10 \2≤n,m≤10 , 输入的内容只包含 0 \le val \le 1 \0≤val≤1
输入描述:
输入两个整数,分别表示二维数组的行数,列数。再输入相应的数组,其中的1表示墙壁,0表示可以走的路。数据保证有唯一解,不考虑有多解的情况,即迷宫只有一条通道。
输出描述:
左上角到右下角的最短路径,格式如样例所示。
5 5
0 1 0 0 0
0 1 1 1 0
0 0 0 0 0
0 1 1 1 0
0 0 0 1 0
输出格式
(0,0)
(1,0)
(2,0)
(2,1)
(2,2)
(2,3)
(2,4)
(3,4)
(4,4)
这道题是经典的dfs的场景,
以下代码可以参考 已经测试通过
import java.util.*; // 注意类名必须为 Main, 不要有任何 package xxx 信息 class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); // 注意 hasNext 和 hasNextLine 的区别 int n = in.nextInt(); int m = in.nextInt(); int[][] ints=new int[n][m]; for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { ints[i][j] = in.nextInt(); } } boolean[][] booleans=new boolean[n][m]; Deque<String> res=new LinkedList<>(); dfs(ints,0,0,booleans,res); for (String re : res) { System.out.println(re); } } private static boolean dfs(int[][] ints, int i, int Y,boolean[][] booleans,Deque<String> path) { //递归结束标记 if(i==ints.length-1 && Y==ints[0].length-1){ path.addLast("("+i+","+Y+")"); return true; } booleans[i][Y]=true; path.addLast("("+i+","+Y+")"); //下探 //向下走第一个条件是剪枝 第二个避免 重复走 if(i+1<=ints.length-1 && !booleans[i+1][Y]&&ints[i+1][Y]==0&&dfs(ints,i+1,Y,booleans,path)){ return true; } ; if(i-1>=0 && !booleans[i-1][Y]&&ints[i-1][Y]==0&&dfs(ints,i-1,Y,booleans,path)){ return true; } ; if(Y+1<=ints[0].length-1 && !booleans[i][Y+1]&&ints[i][Y+1]==0&&dfs(ints,i,Y+1,booleans,path)){ return true; } ; if(Y-1>=0 && !booleans[i][Y-1]&&ints[i][Y-1]==0&&dfs(ints,i,Y-1,booleans,path)){ return true; } ; //回溯 booleans[i][Y]=false; path.removeLast(); return false; } }