impl Solution { pub fn knight_probability(n: i32, k: i32, r: i32, c: i32) -> f64 { if k == 0 { return 1 as f64; }
let (dx, dy) : ([i32; 8], [i32; 8]) = ( [-1, -2, -2, -1, 1, 2, 2, 1], [-2, -1, 1, 2, 2, 1, -1, -2]); let mut dp = vec![vec![1 as f64; n as usize]; n as usize]; for _m in 0..k { let mut tmp = vec![vec![0 as f64; n as usize]; n as usize]; for i in 0..n { for j in 0..n { for k in 0..8 { let (xx, yy) = (i + dx[k], j + dy[k]); if xx < 0 || yy < 0 || xx >= n || yy >= n { continue; } tmp[i as usize][j as usize] += dp[xx as usize][yy as usize]; } } } dp.swap_with_slice(&mut tmp[0..]); }
return dp[r as usize][c as usize] / 8_f64.powf(k as f64); } }
|