Problem:
Problem B : Grid

r × c の2次元グリッド上の２つの座標 (a1,a2) と (b1,b2) が与えられる。
あるマス (e,f) から (e+1,f)、(e-1,f)、(e,f+1)、(e,f-1) のどれかのマスに移動するコストを１とする。
また、(e,c-1) と (e,0)、(r-1,f) と (0,f) の間もコスト１で移動することができる。
この時に１つ目の座標から２つ目の座標へ最短コストで移動できる経路の数を求めよ。

Input

入力は以下のフォーマットで与えられる。

r c a1 a2 b1 b2

入力は以下の制約を満たす

1 ≤ r , c ≤ 1,000

0 ≤ a1 , b1 < r

0 ≤ a2 , b2 < c

Output

答えの値を100,000,007で割った余りを出力せよ。

Sample Input 1

4 4 0 0 3 3

Sample Output 1

2

Sample Input 2

4 4 0 0 1 1

Sample Output 2

2

Sample Input 3

2 3 0 0 1 2

Sample Output 3

4

Sample Input 4

500 500 0 0 200 200

Sample Output 4

34807775

Solution in JAVA (judge verdict: Accepted)

import java.util.Arrays;
import java.util.Scanner;

public class Main {

	Scanner sc = new Scanner(System.in);
	final int p = 100000007;
	int[][] dp = new int[1001][1001];

	void run() {
		init();
		int r = sc.nextInt();
		int c = sc.nextInt();
		int a1 = sc.nextInt();
		int a2 = sc.nextInt();
		int b1 = sc.nextInt();
		int b2 = sc.nextInt();
		int w1 = Math.abs(a1 - b1);
		int h1 = Math.abs(a2 - b2);
		int w2 = r - Math.abs(a1 - b1);
		int h2 = c - Math.abs(a2 - b2);

		int w = Math.min(w1, w2);
		int h = Math.min(h1, h2);
		int ans = dp[w + h][w];
		if (w1 == w2)
			ans = ans * 2 % p;
		if (h1 == h2)
			ans = ans * 2 % p;
		System.out.println(ans);
	}

	void init() {
		dp[0][0] = 1;
		for (int i = 1; i < 1001; i++) {
			dp[i][0] = 1;
			for (int j = 1; j < 1001; j++) {
				dp[i][j] = (dp[i - 1][j] + dp[i - 1][j - 1]) % p;
			}
		}
	}

	public static void main(String[] args) throws Exception {
		new Main().run();
	}
}