44#include < algorithm>
55#include < set>
66#include < map>
7+ #include < queue>
78#include < cstring>
9+ #include < climits>
10+ #include < cstdio>
811using 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 };
1121
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] ;
2737 }
2838 }
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];
5440 }
55-
41+
5642// BEGIN CUT HERE
5743 public:
5844 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 {
6652 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)); }
6753
6854// END CUT HERE
55+
56+ };
6957
70- };
58+ // BEGIN CUT HERE
59+ int main (){
7160
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