1.迷宫
1.1思路分析
迷宫问题,但是题主本人并没有做过类似的题目,知道以dfs的方法解题,但是思路想错了:dfs递归遍历二维数组,将当前格子记为已标记,如果当前格子四周有一个地方能走出迷宫,那么就把当前格子设置为通路,那么其他任何地方只要能走到这个位置的人都能走出迷宫,这个思路和岛屿问题很像,但是我并没有考虑走过的格子是标记过的,标记的格子走到了会自动退出循环,所以导致我后面没能成功AC(也可能是本人太菜了)。
- 正确思路:
从上面的图中可以知道,如果当前的格子是不能走出迷宫的,那么最后必然会走进已经走过的格子,根绝这个思路,我们确定dfs的思路,如果递归结果已经走出了迷宫之外,那么表示当前的人能够走出迷宫,则count++。并且把每次经过的地方都标记已经走过(这里需要注意的是,我们的vis数组在每次dfs的时候都需要初始化,因为不同的人——即不同的入口都是不相关的),相反的如果当前的入口最后会走入一个已经走过的格子的话,直接退出当前的dfs。
1.2代码
import java.util.Arrays;import java.util.Scanner;public class Main2 {static int count=0;static boolean[][] vis=new boolean[10][10];//static boolean[][] can=new boolean[10][10];public static void main(String[] args) {char[][] arr=new char[10][10];Scanner sc=new Scanner(System.in);for(int i=0;i<arr.length;i++){String s=sc.nextLine();for(int j=0;j<arr[i].length;j++){arr[i][j]=s.charAt(j);}}// for (int i = 0; i < arr.length; i++) {// for(int j=0;j<arr[i].length;j++){// System.out.print(arr[i][j]);// }// System.out.println();// } //打印迷宫for(int i=0;i<arr.length;i++){for(int j=0;j<arr[i].length;j++){for(int k=0;k<vis.length;k++){Arrays.fill(vis[k],false); //初始化数组}dfs(arr,i,j);}}System.out.println(count);}public static void dfs(char[][] arr,int i,int j){if(i<0||i>=arr.length||j<0||j>=arr[i].length){count++;return;}if(vis[i][j]){return;}vis[i][j]=true;if(arr[i][j]=='U')dfs(arr,i-1,j);if(arr[i][j]=='D')dfs(arr,i+1,j);if(arr[i][j]=='L')dfs(arr,i,j-1);if(arr[i][j]=='R')dfs(arr,i,j+1);}}

