1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| class Solution { public: double *dp; int myN; int myK; int mydpWidth; double OutP(int i,int j, int k){ if(dp[i*mydpWidth+j*(myK+1)+k]>=0.0) return dp[i*mydpWidth+j*(myK+1)+k]; int ni,nj; double oc = 0.0; static int step[8][2] = {{-2,-1},{-2,1},{-1,2},{1,2},{2,1},{2,-1},{1,-2},{-1,-2}}; for(int idx=0;idx<8;++idx) { ni=i+step[idx][0]; nj=j+step[idx][1]; if(ni>=myN || nj >=myN || ni<0 || nj<0){ oc += 1.0; } else oc += OutP(ni,nj, k-1); }
dp[i*mydpWidth+j*(myK+1)+k] = oc/8.0; return dp[i*mydpWidth+j*(myK+1)+k]; } double knightProbability(int N, int K, int r, int c) { dp = new double[N*N*(K+1)]; for(int i=0;i<N*N*(K+1);++i) dp[i] = -1.0; for(int i=0;i<N*N;++i) dp[i*(K+1)] = 0.0; myN = N; myK = K; mydpWidth = N*(K+1); return 1-OutP(r,c,K); } };
|