Skip to content

Commit 6dfb5fe

Browse files
committed
tccc 03 round 4 250 sol
1 parent 1ebc77a commit 6dfb5fe

File tree

1 file changed

+37
-51
lines changed

1 file changed

+37
-51
lines changed

ChessMetric.cpp

+37-51
Original file line numberDiff line numberDiff line change
@@ -4,55 +4,41 @@
44
#include <algorithm>
55
#include <set>
66
#include <map>
7+
#include <queue>
78
#include <cstring>
9+
#include <climits>
10+
#include <cstdio>
811
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};
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

Comments
 (0)