classSolution{public:doubleknightProbability(intN,intK,intr,intc){constexprdoublekProb=0.125;constvector<pair<int,int>>dirs{{-2,1},{-1,2},{1,2},{2,1},{2,-1},{1,-2},{-1,-2},{-2,-1}};// dp[i][j] := probability to stand on (i, j)vector<vector<double>>dp(N,vector<double>(N));dp[r][c]=1.0;for(intk=0;k<K;++k){vector<vector<double>>newDp(N,vector<double>(N));for(inti=0;i<N;++i)for(intj=0;j<N;++j)if(dp[i][j]>0.0){for(constauto&[dx,dy]:dirs){constintx=i+dx;constinty=j+dy;if(x<0||x>=N||y<0||y>=N)continue;newDp[x][y]+=dp[i][j]*kProb;}}dp=move(newDp);}returnaccumulate(begin(dp),end(dp),0.0,[](doubles,vector<double>&row){returns+accumulate(begin(row),end(row),0.0);});}};
classSolution{publicdoubleknightProbability(intN,intK,intr,intc){finaldoublekProb=0.125;finalint[][]dirs={{-2,1},{-1,2},{1,2},{2,1},{2,-1},{1,-2},{-1,-2},{-2,-1}};// dp[i][j] := probability to stand on (i, j)double[][]dp=newdouble[N][N];dp[r][c]=1.0;for(intk=0;k<K;++k){double[][]newDp=newdouble[N][N];for(inti=0;i<N;++i)for(intj=0;j<N;++j)if(dp[i][j]>0.0){for(int[]dir:dirs){finalintx=i+dir[0];finalinty=j+dir[1];if(x<0||x>=N||y<0||y>=N)continue;newDp[x][y]+=dp[i][j]*kProb;}}dp=newDp;}doubleans=0.0;for(double[]row:dp)ans+=Arrays.stream(row).sum();returnans;}}
classSolution:defknightProbability(self,N:int,K:int,r:int,c:int)->float:dirs=[(1,2),(2,1),(2,-1),(1,-2),(-1,-2),(-2,-1),(-2,1),(-1,2)]# dp[i][j] := probability to stand on (i, j)dp=[[0]*Nfor_inrange(N)]dp[r][c]=1for_inrange(K):newDp=[[0]*Nfor_inrange(N)]foriinrange(N):forjinrange(N):fordx,dyindirs:x=i+dxy=j+dyif0<=x<Nand0<=y<N:newDp[i][j]+=dp[x][y]dp=newDpreturnsum(map(sum,dp))/8**K