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 C++ (judge verdict: Accepted)

#include<bits/stdc++.h>

#define REP(i,s,n) for(int i=s;i<n;i++)
#define rep(i,n) REP(i,0,n)

using namespace std;

typedef long long ll;
const ll MOD = 100000007LL;
const int IINF = INT_MAX;

int h,w,ax,ay,bx,by;
ll memo[1010][1010];
int mindist[1010][1010];
int dx[] = {0,1,0,-1};
int dy[] = {1,0,-1,0};

bool isValid(int x,int y) { return 0 <= x && x < w && 0 <= y && y < h; }

int main(){
  cin >> w >> h >> ax >> ay >> bx >> by;
  rep(i,h) rep(j,w) mindist[i][j] = IINF;
  mindist[ay][ax] = 0;
  memo[ay][ax] = 1LL;
  deque<int> deq;
  deq.push_back(ax+ay*w);
  while( !deq.empty() ){
    int cur = deq.front(); deq.pop_front();
    int x = cur % w, y = cur / w;
    rep(i,4){
      int nx = x + dx[i], ny = y + dy[i];
      if( !isValid(nx,ny) ) {
        if( nx <  0 ) nx = w - 1;
        if( nx >= w ) nx = 0;
        if( ny <  0 ) ny = h - 1;
        if( ny >= h ) ny = 0;
      }
      if( mindist[ny][nx] >= mindist[y][x] + 1 ) {
        if( mindist[ny][nx] > mindist[y][x] + 1 ) deq.push_back(nx+ny*w);
        mindist[ny][nx] = mindist[y][x] + 1;
        ( memo[ny][nx] += memo[y][x] ) %= MOD;
      }
    }
  }
  cout << memo[by][bx] << endl;
  return 0;
}