题目链接:https://leetcode-cn.com/problems/out-of-boundary-paths/submissions/
方法:动态规划,定义一个状态dp[i][j][k],表示从(i,j)最大移动几步出界
class Solution {
public:
int findPaths(int m, int n, int maxMove, int startRow, int startColumn) {
const int mod = 1000000007;//定义取余的余数
int dp[51][51][51]={0};//dp数组,依次为x坐标,y坐标,最大移动长度
for(int i=0;i<m;i++)//初始化边界
{
for(int j=0;j<n;j++)
{
if(i==0)
{
for(int k=1;k<=maxMove;k++)
{
dp[i][j][k]++;//这意味着从(i,j)出界,最大路径长度为k的情况数+1
}
}
if(i==m-1)
{
for(int k=1;k<=maxMove;k++)
{
dp[i][j][k]++;//这意味着从(i,j)出界,最大路径长度为k的情况数+1
}
}
if(j==0)
{
for(int k=1;k<=maxMove;k++)
{
dp[i][j][k]++;//这意味着从(i,j)出界,最大路径长度为k的情况数+1
}
}
if(j==n-1)
{
for(int k=1;k<=maxMove;k++)
{
dp[i][j][k]++;//这意味着从(i,j)出界,最大路径长度为k的情况数+1
}
}
}
}
vector<pair<int,int>> dir={{0,1},{0,-1},{1,0},{-1,0}};//枚举四个方向
for(int i=1;i<=maxMove;i++)//枚举可移动步数
{
for(int j=0;j<m;j++)//枚举横坐标
{
for(int k=0;k<n;k++)//枚举纵坐标
{
for(int l=0;l<4;l++)//寻找相邻位置
{
int nx = j+dir[l].first, ny = k+dir[l].second;//找到相邻位置的坐标
if(nx>=0&&nx<m&&ny>=0&&ny<n)//如果相邻位置在矩阵内,参与状态转移
{
dp[j][k][i]+=dp[nx][ny][i-1];//状态转移
dp[j][k][i]%=mod;//取余
}
}
}
}
}
return dp[startRow][startColumn][maxMove];//返回从(startRow,startColumn),最大长度为maxMove,然后出界的情况有几种
}
};