1 public class test 2 { 3 public static void main(String[] args) 4 { 5 Scanner input = new Scanner(System.in); 6 int m = input.nextInt(); 7 int n = input.nextInt(); 8 int[][] aux = new int[][]{{0,0,1,0,0,0,0},{0,0,0,0,1,0,0},{0,1,0,0,0,0,0}}; 9 //iterative 10 System.out.println(uniquePath_2(m, n, aux)); 11 //recursive 12 int i, j; 13 for(j = 0; j < aux[0].length && aux[0][j] == 0; j++); 14 int p = j; 15 for(i = 0; i < aux.length && aux[i][0] == 0; i++); 16 int q = i; 17 int[][] dp = new int[m][n]; 18 //p: 第一行中障碍物的位置 q: 第一列中障碍物的位置(下标) 19 System.out.println(uniquePath_2(m - 1, n - 1, aux, dp, p, q)); 20 } 21 22 //iterative 23 public static int uniquePath_2(int m, int n, int[][] aux) 24 { 25 int[][] dp = new int[m][n]; 26 27 //第一行赋值 28 for(int j = 1; j < aux[0].length && aux[0][j] != 1; j++) 29 dp[0][j] = 1; 30 //第一列赋值 31 for(int i = 1; i < aux.length && aux[i][0] != 1; i++) 32 dp[i][0] = 1; 33 34 for(int i = 1; i < dp.length; i++) 35 for(int j = 1; j < dp[0].length; j++) 36 { 37 if(aux[i][j] == 1) 38 dp[i][j] = 0; 39 else 40 dp[i][j] = dp[i - 1][j] + dp[i][j - 1]; 41 } 42 43 return dp[dp.length - 1][dp[0].length - 1]; 44 } 45 46 public static int uniquePath_2(int m, int n, int[][] aux, int[][] dp, int p, int q) 47 { 48 //第一行 49 if(m == 0) 50 { 51 if(n >= p) 52 return 0; 53 return 1; 54 } 55 //第一列 56 if(n == 0) 57 { 58 if(m >= q) 59 return 0; 60 return 1; 61 } 62 63 if(aux[m][n] == 1) 64 dp[m][n] = 0; 65 else 66 { 67 if(dp[m][n - 1] == 0) 68 dp[m][n - 1] = uniquePath_2(m, n - 1, aux, dp, p, q); 69 if(dp[m - 1][n] == 0) 70 dp[m - 1][n] = uniquePath_2(m - 1, n, aux, dp, p, q); 71 dp[m][n] = dp[m][n - 1] + dp[m - 1][n]; 72 } 73 74 return dp[m][n]; 75 } 76 }