因为没有接触过DP 虽然知道要用递推代替递归 但最后还是没想明白怎么写 查询资料之后知道了这道题可以用动态规划DP来做 很简单的状态转移方程式:
dp[i][j]=dp[i-1][j]+dp[i][j-1]
(第 dp[i][j] 个位置到达的可能性是第 dp[i-1][j] 个位置方案数 + 第 dp[i][j-1] 个位置的方案数)
#include <iostream>
using namespace std;
int m,n;
long long arr[25][25]={0};
void dfs(int x,int y,long &router)
{
if(arr[x][y]==9)
{
router++;
return;
}
if(arr[x][y]==-1) return;
if(x>m || y>n) return;
dfs(x+1,y,router);
dfs(x,y+1,router);
}
int main()
{
int a,b;
cin>>m>>n>>a>>b;
long long router=0;
//对马食的九个位置置-1
arr[a][b]=-1;
arr[a+1][b+2]=-1;
if(a-1>=0) arr[a-1][b+2]=-1;
arr[a+2][b+1]=-1;
if(a-2>=0) arr[a-2][b+1]=-1;
if(b-1>=0) arr[a+2][b-1]=-1;
if(a-2>=0 && b-1>=0) arr[a-2][b-1]=-1;
if(b-2>=0) arr[a+1][b-2]=-1;
if(a-1>=0 && b-2>=0)arr[a-1][b-2]=-1;
dfs(0,0,router);
cout<<router<<endl;
}
#include <iostream>
using namespace std;
int m,n;
long long arr[25][25]={0};
void dp()
{
if(arr[0][0]==-1) return; //马食位置
arr[0][0]=1;
for(int i=0;i<=m;i++) for(int j=0;j<=n;j++) //DP
if(arr[i][j]!=-1)
{
if(i && arr[i-1][j]!=-1) arr[i][j]+=arr[i-1][j];
if(j && arr[i][j-1]!=-1) arr[i][j]+=arr[i][j-1];
}
}
int main()
{
// m,n为目的坐标 a,b为马的位置
int a,b;
cin>>m>>n>>a>>b;
arr[a][b]=-1;
arr[a+1][b+2]=-1;
arr[a][b]=-1;
if(a-1>=0) arr[a-1][b+2]=-1;
arr[a+2][b+1]=-1;
if(a-2>=0) arr[a-2][b+1]=-1;
if(b-1>=0) arr[a+2][b-1]=-1;
if(a-2>=0 && b-1>=0) arr[a-2][b-1]=-1;
if(b-2>=0) arr[a+1][b-2]=-1;
if(a-1>=0 && b-2>=0)arr[a-1][b-2]=-1;
dp();
cout<<arr[m][n]<<endl;
}
原文:https://www.cnblogs.com/xiaomulei/p/10113891.html