classSolution{public:intknightDialer(intn){constexprintkMod=1'000'000'007;constvector<pair<int,int>>dirs={{-2,1},{-1,2},{1,2},{2,1},{2,-1},{1,-2},{-1,-2},{-2,-1}};// dp[i][j] := # of ways to stand on (i, j)vector<vector<int>>dp(4,vector<int>(3,1));dp[3][0]=dp[3][2]=0;for(intk=0;k<n-1;++k){vector<vector<int>>newDp(4,vector<int>(3));for(inti=0;i<4;++i)for(intj=0;j<3;++j){if(isNotNumericCell(i,j))continue;for(constauto&[dx,dy]:dirs){constintx=i+dx;constinty=j+dy;if(x<0||x>=4||y<0||y>=3)continue;if(isNotNumericCell(x,y))continue;newDp[i][j]=(newDp[i][j]+dp[x][y])%kMod;}}dp=move(newDp);}intans=0;for(constvector<int>&row:dp)for(constinta:row)ans=(ans+a)%kMod;returnans;}private:boolisNotNumericCell(inti,intj){returni==3&&(j==0||j==2);}};
classSolution{publicintknightDialer(intn){finalintkMod=1_000_000_007;finalint[][]dirs={{-2,1},{-1,2},{1,2},{2,1},{2,-1},{1,-2},{-1,-2},{-2,-1}};// dp[i][j] := # of ways to stand on (i, j)int[][]dp=newint[4][3];Arrays.stream(dp).forEach(row->Arrays.fill(row,1));dp[3][0]=dp[3][2]=0;for(intk=0;k<n-1;++k){int[][]newDp=newint[4][3];for(inti=0;i<4;++i)for(intj=0;j<3;++j){if(isNotNumericCell(i,j))continue;for(int[]dir:dirs){finalintx=i+dir[0];finalinty=j+dir[1];if(x<0||x>=4||y<0||y>=3)continue;if(isNotNumericCell(x,y))continue;newDp[i][j]=(newDp[i][j]+dp[x][y])%kMod;}}dp=newDp;}intans=0;for(int[]row:dp)for(finalinta:row)ans=(ans+a)%kMod;returnans;}privatebooleanisNotNumericCell(inti,intj){returni==3&&(j==0||j==2);}}
classSolution:defknightDialer(self,n:int)->int:kMod=1_000_000_007dirs=[(-2,1),(-1,2),(1,2),(2,1),(2,-1),(1,-2),(-1,-2),(-2,-1)]# dp[i][j] := # Of ways stand on (i, j)dp=[[1]*3for_inrange(4)]dp[3][0]=dp[3][2]=0for_inrange(n-1):newDp=[[0]*3for_inrange(4)]foriinrange(4):forjinrange(3):if(i,j)in((3,0),(3,2)):continuefordx,dyindirs:x=i+dxy=j+dyifx<0orx>=4ory<0ory>=3:continueif(x,y)in((3,0),(3,2)):continuenewDp[x][y]=(newDp[x][y]+dp[i][j])%kModdp=newDpreturnsum(map(sum,dp))%kMod