Skip to content

Commit 0e5a51f

Browse files
committed
Add C++ solutions for leetcode 688.
1 parent db7bbdc commit 0e5a51f

File tree

2 files changed

+92
-0
lines changed

2 files changed

+92
-0
lines changed
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
#include<vector>
2+
#include<algorithm>
3+
#include<iostream>
4+
#include<cstring> /* std::memset在这个头文件中 */
5+
using namespace std;
6+
7+
double f[25][25][101]; /* dp[i][j][k]: 跳k 步后到达格子(i,j), 此时继续按"日"字向前跳, 跳到大K步时留在棋盘上的概率之和(走法的总概率)。 */
8+
class Solution {
9+
public:
10+
double knightProbability(int N, int K, int r, int c) {
11+
memset(f, 0.0, sizeof(f));
12+
for (int i = 0; i < N; i++)
13+
for (int j = 0; j < N; j++)
14+
f[i][j][K] = 1; /* 预处理边界 */
15+
int dx[] = {-2,-1,1,2,2,1,-1,-2}; /* 8组方向向量 */
16+
int dy[] = {1,2,2,1,-1,-2,-2,-1};
17+
for (int k = K - 1; k >= 0; k--)
18+
for (int i = 0; i < N; i++)
19+
for (int j = 0; j < N; j++)
20+
for (int u = 0; u < 8; u++) /* 枚举8个方向, 累加其中合法方向的概率 */
21+
{
22+
int x = i + dx[u], y = j + dy[u];
23+
if (x >= 0 && x < N && y >= 0 && y < N)
24+
f[i][j][k] += f[x][y][k+1] / 8;
25+
}
26+
return f[r][c][0];
27+
}
28+
};
29+
30+
// Test
31+
int main()
32+
{
33+
Solution sol;
34+
int N = 3;
35+
int K = 2;
36+
int r = 0;
37+
int c = 0;
38+
auto res = sol.knightProbability(N, K, r, c);
39+
cout << res << endl;
40+
41+
return 0;
42+
}
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
#include<vector>
2+
#include<algorithm>
3+
#include<iostream>
4+
#include<cstring> /* std::memset在这个头文件中 */
5+
#include<cmath>
6+
using namespace std;
7+
8+
class Solution {
9+
public:
10+
double knightProbability(int N, int K, int r, int c) {
11+
vector<vector<double>> dp0(N, vector<double>(N, 0.0));
12+
dp0[r][c] = 1.0;
13+
int dirs[8][2] = {{1, 2}, {-1, -2}, {1, -2}, {-1, 2},
14+
{2, 1}, {-2, -1}, {2, -1}, {-2, 1}};
15+
for (int k = 0; k < K; k++)
16+
{
17+
vector<vector<double>> dp1(N, vector<double>(N, 0.0));
18+
for (int i = 0; i < N; i++)
19+
for (int j = 0; j < N; j++)
20+
for (int m = 0; m < 8; m++)
21+
{
22+
int x = j + dirs[m][0];
23+
int y = i + dirs[m][1];
24+
if (x < 0 || y < 0 || x >= N || y >= N) continue;
25+
dp1[i][j] += dp0[y][x];
26+
}
27+
std::swap(dp0, dp1);
28+
}
29+
double res = 0;
30+
for (int i = 0; i < N; ++i)
31+
for (int j = 0; j < N; ++j)
32+
res += dp0[i][j];
33+
34+
return res / pow(8, K);
35+
}
36+
};
37+
38+
// Test
39+
int main()
40+
{
41+
Solution sol;
42+
int N = 3;
43+
int K = 2;
44+
int r = 0;
45+
int c = 0;
46+
auto res = sol.knightProbability(N, K, r, c);
47+
cout << res << endl;
48+
49+
return 0;
50+
}

0 commit comments

Comments
 (0)