688.knight-probability-in-chessboard.go 715 B

1234567891011121314151617181920212223242526272829303132333435
  1. var detX = []int{1, -1, 1, -1, 2, -2, 2, -2}
  2. var detY = []int{2, 2, -2, -2, 1, 1, -1, -1}
  3. func knightProbability(N int, K int, r int, c int) float64 {
  4. dp := make([][]float64, N)
  5. for i := range dp {
  6. dp[i] = make([]float64, N)
  7. }
  8. dp[r][c] = 1.0
  9. for i := 0; i < K; i++ {
  10. ndp := make([][]float64, N)
  11. for j := range ndp {
  12. ndp[j] = make([]float64, N)
  13. }
  14. for y := 0; y < N; y++ {
  15. for x := 0; x < N; x++ {
  16. for j := 0; j < 8; j++ {
  17. ny, nx := y+detY[j], x+detX[j]
  18. if ny < 0 || N <= ny || nx < 0 || N <= nx {
  19. continue
  20. }
  21. ndp[y][x] += dp[ny][nx] / 8.0
  22. }
  23. }
  24. }
  25. dp = ndp
  26. }
  27. prob := 0.0
  28. for i := range dp {
  29. for _, p := range dp[i] {
  30. prob += p
  31. }
  32. }
  33. return prob
  34. }