import java.util.*; /** 第一个解法在讨论区用的是最短路求方案 第二个就是就是常见的dp 这类题简化就是从左上角->右下角的方案问题,但是这题目麻烦在于 我们知道起点,但是终点却可能在四个方向 左上 左下 右上 右下 我们只需要转成题目变成:固定起点在左上角,然后将终点固定到右下角,然后直接dp就好了 */ public class Visit { public int countPath(int[][] map, int n, int m) { int[][] f = new int[n + 20][m + 20]; int x1 = 1, y1 = 1, x2 = 1, y2 = 1; for(int i = 0; i < n; i ++){ for(int j = 0; j < m; j ++) if(map[i][j] == 1) { x1 = i; y1 = j; }else if(map[i][j] == 2){ x2 = i; y2 = j; } } int dx = x1 > x2 ? -1 : 1; int dy = y1 > y2 ? -1 : 1; if(dx == -1) x2 = x1 - x2 + x1; //数学推论 没有化简 if(dy == -1) y2 = y1- y2 + y1; //数学推论 //一定是往下 // x2 y2 固定到了右下角 f[x1][y1] = 1; for(int i = x1; i <= x2; i ++){ for(int j = y1; j <= y2; j ++){ if(i - 1 >= x1) f[i][j] += f[i - 1][j]; if(j - 1 >= y1) f[i][j] += f[i][j - 1]; } } return f[x2][y2]; } }