/*
dp[i][j] := 从出发点(x1, y1)到点(i, j)的合法路径条数
初始化:
dp[][] = {0}
dp[x1][y1] = 1
状态方程:
根据马跳的位置推出:
dp[i][j] = dp[i-1][j+2] + dp[i-1][j-2] + dp[i-2][j+1] + dp[i-2][j-1]
答案:
dp[x2][y2]
*/
1 #define _CRTDBG_MAP_ALLOC
2 #include <stdlib.h>
3 #include <crtdbg.h>
4 #define _CRT_SECURE_NO_WARNINGS
5 #define HOME
6
7 #include <iostream>
8 #include <cstdlib>
9 #include <cstdio>
10 #include <cstddef>
11 #include <iterator>
12 #include <algorithm>
13 #include <string>
14 #include <locale>
15 #include <cmath>
16 #include <vector>
17 #include <cstring>
18 using namespace std;
19 const int INF = 0x3f3f3f3f;
20 const int MaxN = 30;
21 const int Max = 55;
22
23 int n, m;
24 int a, b, c, d;
25 int dp[Max][Max];
26 int step[4][2] = { {-1, 2}, {-1, -2}, {-2, 1}, {-2, -1} };
27
28 bool Check(int x, int y)
29 {
30 if ((x<1) || (x>n) || (y<1) || (y>m))
31 {
32 return false;
33 }
34 return true;
35 }
36
37 void Solve()
38 {
39 dp[a][b] = 1;
40 int x, y;
41 for (int i = 1; i <= n; ++i)
42 {
43 for (int j = 1; j <= m; ++j)
44 {
45 for (int p = 0; p < 4; ++p)
46 {
47 x = i + step[p][0];
48 y = j + step[p][1];
49 if (Check(x, y))
50 {
51 dp[i][j] += dp[x][y];
52 }
53 }
54 }
55 }
56
57 /*for (int i = 1; i <= n; ++i)
58 {
59 for (int j = 1; j <= m; ++j)
60 {
61 cout << "(" << i << "," << j << ")" << " : " << dp[i][j] << endl;
62 }
63 }*/
64 cout << dp[c][d] << endl;
65 }
66
67 int main()
68 {
69 #ifdef HOME
70 freopen("in", "r", stdin);
71 //freopen("out", "w", stdout);
72 #endif
73
74 cin >> n >> m;
75 cin >> a >> b >> c >> d;
76 memset(dp, 0, sizeof(dp));
77 Solve();
78
79
80 #ifdef HOME
81 cerr << "Time elapsed: " << clock() / CLOCKS_PER_SEC << " ms" << endl;
82 _CrtDumpMemoryLeaks();
83 system("pause");
84 #endif
85 return 0;
86 }