1、注意结束条件
2、注意步数=0的情况
代码:
package com.leetCode.dp;
public class leet688 {
/**
* 注意走0步的情况
* r和c都在原地,走1步的情况
* @param args
*/
public static void main(String[] args) {
System.out.println(knightProbability(1,1,0,0));
}
static double y=0;
static double s=0;
static int m=0;
public static double knightProbability(int N, int K, int r, int c) {
double ans=0.0;
if(K==0) return 1.0;
int[][][] dp = new int[N][N][K+1];
for(int i=0;i<N;i++)
{
for(int j=0;j<N;j++)
{
for(int k=0;k<=K;k++)
{
dp[i][j][k]=-1;
}
}
}
find(N,K,r,c,dp);
// System.out.println(s+" "+y);
s=Math.pow(8, K);
ans=y/s;
return ans;
}
private static void find(int n, int k, int r, int c, int[][][] dp) {
m++;
if(k<0)
{
s++;
return ;
}
if(r<0||c<0||r>=n||c>=n)
{
return ;
}
if(r>=0&&c>=0&&r<n&&c<n&&k==0)
{
System.out.println(r+" "+c);
s++;
y++;
if(m==1) y--;
return ;
}
if(dp[r][c][k]==-1)
{
find(n,k-1,r+1,c+2,dp);
find(n,k-1,r+1,c-2,dp);
find(n,k-1,r-1,c+2,dp);
find(n,k-1,r-1,c-2,dp);
find(n,k-1,r+2,c+1,dp);
find(n,k-1,r+2,c-1,dp);
find(n,k-1,r-2,c+1,dp);
find(n,k-1,r-2,c-1,dp);
}
}
}