4
4
#include < algorithm>
5
5
#include < set>
6
6
#include < map>
7
+ #include < queue>
7
8
#include < cstring>
9
+ #include < climits>
10
+ #include < cstdio>
8
11
using namespace std ;
9
- long long A[100 ][100 ];
10
- long long B[100 ][100 ];
12
+ typedef pair<int ,int > pi ;
13
+ typedef set<int > si;
14
+ typedef vector<int > vi;
15
+ typedef vector<vi> vvi;
16
+ typedef vector<string> vs;
17
+ typedef long long ll;
18
+ ll dp[105 ][105 ][55 ];
19
+ int X[16 ] = {0 , 0 , 1 , -1 , 1 , -1 , -1 , 1 , 1 , -1 , 1 , -1 , 2 , -2 , 2 , -2 };
20
+ int Y[16 ] = {1 , -1 , 0 , 0 , -1 , 1 , -1 , 1 , 2 , 2 , -2 , -2 , 1 , 1 , -1 , -1 };
11
21
12
- class ChessMetric {
13
- public:
14
- long long howMany (int n , vector <int > start, vector <int > end, int numMoves)
15
- {
16
- int s[ 16 ][ 2 ] = { 1 , 1 ,- 1 , 1 , 1 ,- 1 ,- 1 ,- 1 , 1 , 2 , 1 ,- 2 ,- 1 , 2 ,- 1 ,- 2 , 2 , 1 , 2 ,- 1 ,- 2 , 1 ,- 2 ,- 1 , 0 , 1 , 0 ,- 1 , 1 , 0 ,- 1 , 0 };
17
-
18
- memset (A, 0 , sizeof (A)) ;
19
- memset (B, 0 , sizeof (B)) ;
20
- int i = end[ 0 ], j = end[ 1 ];
21
- for (int k = 0 ; k < 16 ; k ++)
22
- {
23
- int x = i+s[k][ 0 ], y = j+s[k][ 1 ];
24
- if (x < n && y < n && x >= 0 && y >= 0 ){
25
- A[x][y] = 1ll ;
26
- // cout<<x<<" "<<y<<endl ;
22
+ class ChessMetric {
23
+ public:
24
+ long long howMany (int size , vector <int > start, vector <int > end, int numMoves) {
25
+ for ( int i = 0 ; i < 105 ; i++)
26
+ for ( int j = 0 ; j < 105 ; j++)
27
+ for ( int k = 0 ; k < 55 ; k++)
28
+ dp[i][j][k] = 0 ;
29
+ dp[start[ 0 ]][start[ 1 ]][ 0 ] = 1 ;
30
+ for ( int k = 0 ; k <= numMoves; k++)
31
+ for (int x = 0 ; x < size; x ++)
32
+ for ( int y = 0 ; y < size; y++) {
33
+ for ( int i = 0 ; i < 16 ; i++){
34
+ int xx = x + X[i], yy = y + Y[i];
35
+ if (xx >= 0 && yy >= 0 && xx <= size && yy <= size)
36
+ dp[xx][yy][k+ 1 ] += dp[x][y][k] ;
27
37
}
28
38
}
29
-
30
-
31
- if (numMoves == 1 ) return A[start[0 ]][start[1 ]];
32
-
33
- for (int ss = 2 ; ss <= numMoves; ss++){
34
- if (ss%2 ) memset (A, 0 , sizeof (A));
35
- else memset (B, 0 , sizeof (B));
36
-
37
- for (int i = 0 ; i < n; i++)
38
- for (int j = 0 ; j < n; j++)
39
- for (int k = 0 ; k < 16 ; k++)
40
- {
41
- int x = i+s[k][0 ], y = j+s[k][1 ];
42
- if (x < n && y < n && x >= 0 && y >= 0 ){
43
- // cout<<x<<" "<<y<<endl;
44
- if (ss%2 && B[x][y]) A[i][j] += B[x][y];
45
- else if (!(ss%2 ) && A[x][y]) B[i][j] += A[x][y];
46
- }
47
- }
48
- }
49
-
50
- if (numMoves%2 )
51
- return A[start[0 ]][start[1 ]];
52
- return B[start[0 ]][start[1 ]];
53
-
39
+ return dp[end[0 ]][end[1 ]][numMoves];
54
40
}
55
-
41
+
56
42
// BEGIN CUT HERE
57
43
public:
58
44
void run_test (int Case) { if ((Case == -1 ) || (Case == 0 )) test_case_0 (); if ((Case == -1 ) || (Case == 1 )) test_case_1 (); if ((Case == -1 ) || (Case == 2 )) test_case_2 (); if ((Case == -1 ) || (Case == 3 )) test_case_3 (); if ((Case == -1 ) || (Case == 4 )) test_case_4 (); }
@@ -66,13 +52,13 @@ class ChessMetric {
66
52
void test_case_4 () { int Arg0 = 100 ; int Arr1[] = {0 ,0 }; vector <int > Arg1 (Arr1, Arr1 + (sizeof (Arr1) / sizeof (Arr1[0 ]))); int Arr2[] = {0 ,99 }; vector <int > Arg2 (Arr2, Arr2 + (sizeof (Arr2) / sizeof (Arr2[0 ]))); int Arg3 = 50 ; long long Arg4 = 243097320072600LL ; verify_case (4 , Arg4, howMany (Arg0, Arg1, Arg2, Arg3)); }
67
53
68
54
// END CUT HERE
55
+
56
+ };
69
57
70
- };
58
+ // BEGIN CUT HERE
59
+ int main (){
71
60
72
- // BEGIN CUT HERE
73
- int main ()
74
- {
75
- ChessMetric ___test;
76
- ___test.run_test (-1 );
77
- }
78
- // END CUT HERE
61
+ ChessMetric ___test;
62
+ ___test.run_test (-1 );
63
+ }
64
+ // END CUT HERE
0 commit comments