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.LinkedList;
import java.util.Queue;
import java.util.Scanner;

//Grid
public class Main{

	int r, c, si, sj, ti, tj;
	int[][] d = {{-1,0},{0,1},{1,0},{0,-1}};
	int[][] dist, mem;
	int MOD = 100000007, INF = 1<<28;
	
	int get(int i, int j){
		if(mem[i][j]!=-1)return mem[i][j];
		int res = 0;
		for(int k=0;k<4;k++){
			int ni = (i+d[k][0]+r)%r, nj = (j+d[k][1]+c)%c;
			if(dist[ni][nj] < dist[i][j])res+=get(ni, nj);
		}
		return mem[i][j] = res%MOD;
	}
	
	void run(){
		Scanner sc = new Scanner(System.in);
		r = sc.nextInt(); c = sc.nextInt(); si = sc.nextInt(); sj = sc.nextInt(); ti = sc.nextInt(); tj = sc.nextInt();
		dist = new int[r][c];
		for(int[]a:dist)Arrays.fill(a, INF);
		Queue<int[]> q = new LinkedList<int[]>();
		dist[si][sj] = 0;
		q.add(new int[]{si, sj});
		while(!q.isEmpty()){
			int[] V = q.poll();
			for(int k=0;k<4;k++){
				int ni = (V[0]+d[k][0]+r)%r, nj = (V[1]+d[k][1]+c)%c;
				if(dist[ni][nj]==INF){
					dist[ni][nj] = dist[V[0]][V[1]]+1;
					q.add(new int[]{ni, nj});
				}
			}
		}
		mem = new int[r][c];
		for(int[]a:mem)Arrays.fill(a, -1);
		mem[si][sj] = 1;
		System.out.println(get(ti, tj));
	}
	
	public static void main(String[] args) {
		new Main().run();
	}
}