慕容3067478
private static boolean isPossibleOrigin(int x, int y, int n, int pasi) { return x >= 0 && y >= 0 && pasi < 2 * n && (x+y)/2<2*n-pasi;}public static int calcul(int x, int y, int n) { if (x == n && y == 0 ) { return 1; } else if (isPossibleOrigin(x, y, n, 0)) { return right(x+1, y, n,1) + up(x, y+1, n, 1) + leftup(x-1, y+1, n, 1) + rightdown(x+1, y-1, n, 1) + rightup(x+1, y+1, n, 1); } return 0;}public static int right(int x, int y, int n, int pasi) { if (x == n && y == 0 && pasi == 2 * n) { return 1; } else if (isPossibleOrigin(x, y, n, pasi)) { return right(x+1, y, n, pasi + 1) + leftup(x-1, y+1, n, pasi+1) + rightdown(x+1, y-1, n, pasi+1) + rightup(x+1, y+1, n,pasi+ 1); } return 0;}public static int leftup(int x, int y, int n, int pasi) { if (x == n && y == 0 && pasi == 2 * n) { return 1; } else if (isPossibleOrigin(x, y, n, pasi)) { return right(x+1, y, n, pasi + 1) + leftup(x-1, y+1, n, pasi + 1) + up(x,y+1,n,pasi+1) + rightup(x+1, y+1, n,pasi+ 1); } return 0;}public static int rightup(int x, int y, int n, int pasi) { if (x == n && y == 0 && pasi == 2 * n) { return 1; } else if (isPossibleOrigin(x, y, n, pasi)) { return right(x+1, y, n, pasi + 1) + leftup(x-1, y+1, n, pasi + 1) +rightdown(x+1, y-1, n, pasi+1) + rightup(x+1, y+1, n,pasi+ 1); } return 0;}public static int up(int x, int y, int n, int pasi) { if (x == n && y == 0 && pasi == 2 * n) { return 1; } else if (isPossibleOrigin(x, y, n, pasi)) { return +up(x, y+1, n, pasi+1) + leftup(x-1, y+1, n, pasi + 1) +rightdown(x+1, y-1, n, pasi+1) ; } return 0;}public static int rightdown(int x, int y, int n, int pasi) { if (x == n && y == 0 && pasi == 2 * n) { return 1; } else if (isPossibleOrigin(x, y, n, pasi)) { return right(x+1, y, n, pasi + 1) +rightdown(x+1, y-1, n, pasi+1) + up(x,y+1,n,pasi+1) + rightup(x+1, y+1, n, pasi + 1); } return 0;}public static void main(String[] args) {System.out.println("Paths:"+calcul(0, 0, 1));}我认为“?” 可以用“(x+y)/2<2*n-pasi”代替吗?
慕姐4208626
通常,此类问题可以通过纯递归解决,而无需static变量。只需计算每个可能的延续的路径数。在给定的约束下到达所需的目的地后,将完整路径的数量增加 1 ( return 1;),否则通过返回 0 来中断递归。private static boolean isPossibleOrigin(int x, int y, int n, int pasi) { return x >= 0 && y >= 0 && pasi < 2 * n && ?;}public static int calcul(int x, int y, int n) { if (x == n && y == 0 && n == 0) { return 1; } else if (isPossibleOrigin(x, y, n, 0)) { return right(x, y, n, 1) + up(x, y, n, 1) + leftup(x, y, n, 1) + rightdown(x, y, n, 1) + rightup(x, y, n, 1); } return 0;}为每个可能的方向写一个类似的方法,考虑到它的合法延续。public static int right(int x, int y, int n, int pasi) { x = x+1; if (x == n && y == 0 && pasi == 2 * n) { return 1; } else if (isPossibleOrigin(x, y, n, pasi)) { return right(x, y, n, pasi + 1) + leftup(x, y, n, pasi + 1) + rightdown(x, y, n, pasi + 1) + rightup(x, y, n, pasi + 1); } return 0;}...最后,考虑到当节点到目的地的距离大于剩余移动次数时,访问节点不会产生完整路径,您可以显着提高性能。我在现场留下了一个问号,这是您添加适当条件来检查这一点的好地方。