|  | @@ -0,0 +1,35 @@
 | 
	
		
			
				|  |  | +var detX = []int{1, -1, 1, -1, 2, -2, 2, -2}
 | 
	
		
			
				|  |  | +var detY = []int{2, 2, -2, -2, 1, 1, -1, -1}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +func knightProbability(N int, K int, r int, c int) float64 {
 | 
	
		
			
				|  |  | +	dp := make([][]float64, N)
 | 
	
		
			
				|  |  | +	for i := range dp {
 | 
	
		
			
				|  |  | +		dp[i] = make([]float64, N)
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +	dp[r][c] = 1.0
 | 
	
		
			
				|  |  | +	for i := 0; i < K; i++ {
 | 
	
		
			
				|  |  | +		ndp := make([][]float64, N)
 | 
	
		
			
				|  |  | +		for j := range ndp {
 | 
	
		
			
				|  |  | +			ndp[j] = make([]float64, N)
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +		for y := 0; y < N; y++ {
 | 
	
		
			
				|  |  | +			for x := 0; x < N; x++ {
 | 
	
		
			
				|  |  | +				for j := 0; j < 8; j++ {
 | 
	
		
			
				|  |  | +					ny, nx := y+detY[j], x+detX[j]
 | 
	
		
			
				|  |  | +					if ny < 0 || N <= ny || nx < 0 || N <= nx {
 | 
	
		
			
				|  |  | +						continue
 | 
	
		
			
				|  |  | +					}
 | 
	
		
			
				|  |  | +					ndp[y][x] += dp[ny][nx] / 8.0
 | 
	
		
			
				|  |  | +				}
 | 
	
		
			
				|  |  | +			}
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +		dp = ndp
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +	prob := 0.0
 | 
	
		
			
				|  |  | +	for i := range dp {
 | 
	
		
			
				|  |  | +		for _, p := range dp[i] {
 | 
	
		
			
				|  |  | +			prob += p
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +	return prob
 | 
	
		
			
				|  |  | +}
 |