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];
}
}