Skip to content

Commit 7c0ac17

Browse files
authored
feat: add solutions to lc problem: No.0935 (#3819)
No.0935.Knight Dialer
1 parent be7a64e commit 7c0ac17

14 files changed

+1305
-365
lines changed

solution/0900-0999/0935.Knight Dialer/README.md

+431-120
Large diffs are not rendered by default.

solution/0900-0999/0935.Knight Dialer/README_EN.md

+492-116
Large diffs are not rendered by default.
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,21 @@
1-
using ll = long long;
2-
31
class Solution {
42
public:
53
int knightDialer(int n) {
6-
if (n == 1) return 10;
7-
int mod = 1e9 + 7;
8-
vector<ll> f(10, 1ll);
4+
const int mod = 1e9 + 7;
5+
vector<long long> f(10, 1);
96
while (--n) {
10-
vector<ll> t(10);
11-
t[0] = f[4] + f[6];
12-
t[1] = f[6] + f[8];
13-
t[2] = f[7] + f[9];
14-
t[3] = f[4] + f[8];
15-
t[4] = f[0] + f[3] + f[9];
16-
t[6] = f[0] + f[1] + f[7];
17-
t[7] = f[2] + f[6];
18-
t[8] = f[1] + f[3];
19-
t[9] = f[2] + f[4];
20-
for (int i = 0; i < 10; ++i) f[i] = t[i] % mod;
7+
vector<long long> g(10);
8+
g[0] = (f[4] + f[6]) % mod;
9+
g[1] = (f[6] + f[8]) % mod;
10+
g[2] = (f[7] + f[9]) % mod;
11+
g[3] = (f[4] + f[8]) % mod;
12+
g[4] = (f[0] + f[3] + f[9]) % mod;
13+
g[6] = (f[0] + f[1] + f[7]) % mod;
14+
g[7] = (f[2] + f[6]) % mod;
15+
g[8] = (f[1] + f[3]) % mod;
16+
g[9] = (f[2] + f[4]) % mod;
17+
f = g;
2118
}
22-
ll ans = accumulate(f.begin(), f.end(), 0ll);
23-
return (int) (ans % mod);
19+
return accumulate(f.begin(), f.end(), 0LL) % mod;
2420
}
25-
};
21+
};
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,25 @@
11
public class Solution {
22
public int KnightDialer(int n) {
3-
if (n == 1) return 10;
4-
int A = 4;
5-
int B = 2;
6-
int C = 2;
7-
int D = 1;
8-
int MOD = (int)1e9 + 7;
9-
for (int i = 0; i < n - 1; i++) {
10-
int tempA = A;
11-
int tempB = B;
12-
int tempC = C;
13-
int tempD = D;
14-
A = ((2 * tempB) % MOD + (2 * tempC) % MOD) % MOD;
15-
B = tempA;
16-
C = (tempA + (2 * tempD) % MOD) % MOD;
17-
D = tempC;
3+
const int mod = 1000000007;
4+
long[] f = new long[10];
5+
for (int i = 0; i < 10; i++) {
6+
f[i] = 1;
187
}
198

20-
int ans = (A + B) % MOD;
21-
ans = (ans + C) % MOD;
22-
return (ans + D) % MOD;
9+
while (--n > 0) {
10+
long[] g = new long[10];
11+
g[0] = (f[4] + f[6]) % mod;
12+
g[1] = (f[6] + f[8]) % mod;
13+
g[2] = (f[7] + f[9]) % mod;
14+
g[3] = (f[4] + f[8]) % mod;
15+
g[4] = (f[0] + f[3] + f[9]) % mod;
16+
g[6] = (f[0] + f[1] + f[7]) % mod;
17+
g[7] = (f[2] + f[6]) % mod;
18+
g[8] = (f[1] + f[3]) % mod;
19+
g[9] = (f[2] + f[4]) % mod;
20+
f = g;
21+
}
22+
23+
return (int)(f.Sum() % mod);
2324
}
2425
}
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,24 @@
1-
func knightDialer(n int) int {
2-
if n == 1 {
3-
return 10
4-
}
1+
func knightDialer(n int) (ans int) {
52
f := make([]int, 10)
63
for i := range f {
74
f[i] = 1
85
}
9-
mod := int(1e9) + 7
6+
const mod int = 1e9 + 7
107
for i := 1; i < n; i++ {
11-
t := make([]int, 10)
12-
t[0] = f[4] + f[6]
13-
t[1] = f[6] + f[8]
14-
t[2] = f[7] + f[9]
15-
t[3] = f[4] + f[8]
16-
t[4] = f[0] + f[3] + f[9]
17-
t[6] = f[0] + f[1] + f[7]
18-
t[7] = f[2] + f[6]
19-
t[8] = f[1] + f[3]
20-
t[9] = f[2] + f[4]
21-
for j, v := range t {
22-
f[j] = v % mod
23-
}
8+
g := make([]int, 10)
9+
g[0] = (f[4] + f[6]) % mod
10+
g[1] = (f[6] + f[8]) % mod
11+
g[2] = (f[7] + f[9]) % mod
12+
g[3] = (f[4] + f[8]) % mod
13+
g[4] = (f[0] + f[3] + f[9]) % mod
14+
g[6] = (f[0] + f[1] + f[7]) % mod
15+
g[7] = (f[2] + f[6]) % mod
16+
g[8] = (f[1] + f[3]) % mod
17+
g[9] = (f[2] + f[4]) % mod
18+
f = g
2419
}
25-
ans := 0
26-
for _, v := range f {
27-
ans = (ans + v) % mod
20+
for _, x := range f {
21+
ans = (ans + x) % mod
2822
}
29-
return ans
30-
}
23+
return
24+
}
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,21 @@
11
class Solution {
2-
private static final int MOD = (int) 1e9 + 7;
3-
42
public int knightDialer(int n) {
5-
if (n == 1) {
6-
return 10;
7-
}
3+
final int mod = (int) 1e9 + 7;
84
long[] f = new long[10];
95
Arrays.fill(f, 1);
106
while (--n > 0) {
11-
long[] t = new long[10];
12-
t[0] = f[4] + f[6];
13-
t[1] = f[6] + f[8];
14-
t[2] = f[7] + f[9];
15-
t[3] = f[4] + f[8];
16-
t[4] = f[0] + f[3] + f[9];
17-
t[6] = f[0] + f[1] + f[7];
18-
t[7] = f[2] + f[6];
19-
t[8] = f[1] + f[3];
20-
t[9] = f[2] + f[4];
21-
for (int i = 0; i < 10; ++i) {
22-
f[i] = t[i] % MOD;
23-
}
24-
}
25-
long ans = 0;
26-
for (long v : f) {
27-
ans = (ans + v) % MOD;
7+
long[] g = new long[10];
8+
g[0] = (f[4] + f[6]) % mod;
9+
g[1] = (f[6] + f[8]) % mod;
10+
g[2] = (f[7] + f[9]) % mod;
11+
g[3] = (f[4] + f[8]) % mod;
12+
g[4] = (f[0] + f[3] + f[9]) % mod;
13+
g[6] = (f[0] + f[1] + f[7]) % mod;
14+
g[7] = (f[2] + f[6]) % mod;
15+
g[8] = (f[1] + f[3]) % mod;
16+
g[9] = (f[2] + f[4]) % mod;
17+
f = g;
2818
}
29-
return (int) ans;
19+
return (int) (Arrays.stream(f).sum() % mod);
3020
}
31-
}
21+
}
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,16 @@
11
class Solution:
22
def knightDialer(self, n: int) -> int:
3-
if n == 1:
4-
return 10
53
f = [1] * 10
64
for _ in range(n - 1):
7-
t = [0] * 10
8-
t[0] = f[4] + f[6]
9-
t[1] = f[6] + f[8]
10-
t[2] = f[7] + f[9]
11-
t[3] = f[4] + f[8]
12-
t[4] = f[0] + f[3] + f[9]
13-
t[6] = f[0] + f[1] + f[7]
14-
t[7] = f[2] + f[6]
15-
t[8] = f[1] + f[3]
16-
t[9] = f[2] + f[4]
17-
f = t
18-
return sum(t) % (10**9 + 7)
5+
g = [0] * 10
6+
g[0] = f[4] + f[6]
7+
g[1] = f[6] + f[8]
8+
g[2] = f[7] + f[9]
9+
g[3] = f[4] + f[8]
10+
g[4] = f[0] + f[3] + f[9]
11+
g[6] = f[0] + f[1] + f[7]
12+
g[7] = f[2] + f[6]
13+
g[8] = f[1] + f[3]
14+
g[9] = f[2] + f[4]
15+
f = g
16+
return sum(f) % (10**9 + 7)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
class Solution {
2+
public:
3+
int knightDialer(int n) {
4+
const int mod = 1e9 + 7;
5+
vector<vector<int>> base = {
6+
{0, 0, 0, 0, 1, 0, 1, 0, 0, 0},
7+
{0, 0, 0, 0, 0, 0, 1, 0, 1, 0},
8+
{0, 0, 0, 0, 0, 0, 0, 1, 0, 1},
9+
{0, 0, 0, 0, 1, 0, 0, 0, 1, 0},
10+
{1, 0, 0, 1, 0, 0, 0, 0, 0, 1},
11+
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
12+
{1, 1, 0, 0, 0, 0, 0, 1, 0, 0},
13+
{0, 0, 1, 0, 0, 0, 1, 0, 0, 0},
14+
{0, 1, 0, 1, 0, 0, 0, 0, 0, 0},
15+
{0, 0, 1, 0, 1, 0, 0, 0, 0, 0}};
16+
vector<vector<int>> res = pow(base, n - 1, mod);
17+
return accumulate(res[0].begin(), res[0].end(), 0LL) % mod;
18+
}
19+
20+
private:
21+
vector<vector<int>> mul(const vector<vector<int>>& a, const vector<vector<int>>& b, int mod) {
22+
int m = a.size(), n = b[0].size();
23+
vector<vector<int>> c(m, vector<int>(n, 0));
24+
for (int i = 0; i < m; ++i) {
25+
for (int j = 0; j < n; ++j) {
26+
for (int k = 0; k < b.size(); ++k) {
27+
c[i][j] = (c[i][j] + (1LL * a[i][k] * b[k][j]) % mod) % mod;
28+
}
29+
}
30+
}
31+
return c;
32+
}
33+
34+
vector<vector<int>> pow(vector<vector<int>>& a, int n, int mod) {
35+
int size = a.size();
36+
vector<vector<int>> res(1, vector<int>(size, 1));
37+
while (n > 0) {
38+
if (n % 2 == 1) {
39+
res = mul(res, a, mod);
40+
}
41+
a = mul(a, a, mod);
42+
n /= 2;
43+
}
44+
return res;
45+
}
46+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
public class Solution {
2+
private const int mod = 1000000007;
3+
private readonly int[][] baseMatrix = {
4+
new int[] {0, 0, 0, 0, 1, 0, 1, 0, 0, 0},
5+
new int[] {0, 0, 0, 0, 0, 0, 1, 0, 1, 0},
6+
new int[] {0, 0, 0, 0, 0, 0, 0, 1, 0, 1},
7+
new int[] {0, 0, 0, 0, 1, 0, 0, 0, 1, 0},
8+
new int[] {1, 0, 0, 1, 0, 0, 0, 0, 0, 1},
9+
new int[] {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
10+
new int[] {1, 1, 0, 0, 0, 0, 0, 1, 0, 0},
11+
new int[] {0, 0, 1, 0, 0, 0, 1, 0, 0, 0},
12+
new int[] {0, 1, 0, 1, 0, 0, 0, 0, 0, 0},
13+
new int[] {0, 0, 1, 0, 1, 0, 0, 0, 0, 0}
14+
};
15+
16+
public int KnightDialer(int n) {
17+
int[][] res = Pow(baseMatrix, n - 1);
18+
int ans = 0;
19+
foreach (var x in res[0]) {
20+
ans = (ans + x) % mod;
21+
}
22+
return ans;
23+
}
24+
25+
private int[][] Mul(int[][] a, int[][] b) {
26+
int m = a.Length, n = b[0].Length;
27+
int[][] c = new int[m][];
28+
for (int i = 0; i < m; i++) {
29+
c[i] = new int[n];
30+
}
31+
32+
for (int i = 0; i < m; i++) {
33+
for (int j = 0; j < n; j++) {
34+
for (int k = 0; k < b.Length; k++) {
35+
c[i][j] = (int)((c[i][j] + (long)a[i][k] * b[k][j]) % mod);
36+
}
37+
}
38+
}
39+
return c;
40+
}
41+
42+
private int[][] Pow(int[][] a, int n) {
43+
int size = a.Length;
44+
int[][] res = new int[1][];
45+
res[0] = new int[size];
46+
for (int i = 0; i < size; i++) {
47+
res[0][i] = 1;
48+
}
49+
50+
while (n > 0) {
51+
if (n % 2 == 1) {
52+
res = Mul(res, a);
53+
}
54+
a = Mul(a, a);
55+
n /= 2;
56+
}
57+
58+
return res;
59+
}
60+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
const mod = 1e9 + 7
2+
3+
func knightDialer(n int) int {
4+
base := [][]int{
5+
{0, 0, 0, 0, 1, 0, 1, 0, 0, 0},
6+
{0, 0, 0, 0, 0, 0, 1, 0, 1, 0},
7+
{0, 0, 0, 0, 0, 0, 0, 1, 0, 1},
8+
{0, 0, 0, 0, 1, 0, 0, 0, 1, 0},
9+
{1, 0, 0, 1, 0, 0, 0, 0, 0, 1},
10+
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
11+
{1, 1, 0, 0, 0, 0, 0, 1, 0, 0},
12+
{0, 0, 1, 0, 0, 0, 1, 0, 0, 0},
13+
{0, 1, 0, 1, 0, 0, 0, 0, 0, 0},
14+
{0, 0, 1, 0, 1, 0, 0, 0, 0, 0},
15+
}
16+
17+
res := pow(base, n-1)
18+
ans := 0
19+
for _, x := range res[0] {
20+
ans = (ans + x) % mod
21+
}
22+
return ans
23+
}
24+
25+
func mul(a, b [][]int) [][]int {
26+
m := len(a)
27+
n := len(b[0])
28+
c := make([][]int, m)
29+
for i := range c {
30+
c[i] = make([]int, n)
31+
}
32+
for i := 0; i < m; i++ {
33+
for j := 0; j < n; j++ {
34+
for k := 0; k < len(b); k++ {
35+
c[i][j] = (c[i][j] + a[i][k]*b[k][j]) % mod
36+
}
37+
}
38+
}
39+
return c
40+
}
41+
42+
func pow(a [][]int, n int) [][]int {
43+
size := len(a)
44+
res := make([][]int, 1)
45+
res[0] = make([]int, size)
46+
for i := 0; i < size; i++ {
47+
res[0][i] = 1
48+
}
49+
50+
for n > 0 {
51+
if n%2 == 1 {
52+
res = mul(res, a)
53+
}
54+
a = mul(a, a)
55+
n /= 2
56+
}
57+
58+
return res
59+
}

0 commit comments

Comments
 (0)