对于本题的两种代码实现
2025-10-16 16:21:23
发布于:广东
5阅读
0回复
0点赞
法一:
#include <bits/stdc++.h>
using namespace std;
int a[25][25];
long long dp[25][25];
// dp[n][m]:表示的是,到达(n,m) 这个点的总路径数
int dx[8]={2,2,-2,-2,1,1,-1,-1};
int dy[8]={1,-1,1,-1,2,-2,2,-2};
int main(){
int n,m,x,y;
cin>>n>>m>>x>>y;
n++;m++;x++;y++;//预处理
a[x][y]=1;
// a[x+2][y+1]=1;a[x+2][y-1]=1;a[x-2][y+1]=1;a[x-2][y-1]=1;
// a[x+1][y+2]=1;a[x+1][y-2]=1;a[x-1][y+2]=1;a[x-1][y-2]=1;
for(int i = 0;i < 8;i++){
int tx = x + dx[i];
int ty = y + dy[i];
if(tx >= 0 && tx <= n && ty >= 0 && ty <= m){
a[tx][ty] = 1;//使用方向数组进行特征描述
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(a[i][j]==1) continue;//如果是被阻拦,所以不去考虑
if(i==1 && j==1){
dp[i][j]=1;
}
else dp[i][j]=dp[i-1][j]+dp[i][j-1];
}
}
cout<<dp[n][m];
return 0;
}
/*
不在循环外初始化,而是在双重循环内部判断:
当 i==1 && j==1 时,才将 dp[i][j] = 1
(仅在起点不是障碍物时执行,因为若起点是障碍物会被 continue 跳过)
对非起点位置使用 dp[i][j] = dp[i-1][j] + dp[i][j-1](直接赋值),逻辑更直接,
符合 “路径数 = 上方路径数 + 左方路径数” 的定义。
*/
法二:
#include <bits/stdc++.h>
using namespace std;
int a[25][25];
long long dp[25][25];
// dp[n][m]:表示的是,到达(n,m) 这个点的总路径数
int dx[8]={2,2,-2,-2,1,1,-1,-1};
int dy[8]={1,-1,1,-1,2,-2,2,-2};
int main(){
int n,m,x,y;
cin>>n>>m>>x>>y;
n++;m++;x++;y++;//预处理
a[x][y]=1;
// a[x+2][y+1]=1;a[x+2][y-1]=1;a[x-2][y+1]=1;a[x-2][y-1]=1;
// a[x+1][y+2]=1;a[x+1][y-2]=1;a[x-1][y+2]=1;a[x-1][y-2]=1;
for(int i = 0;i < 8;i++){
int tx = x + dx[i];
int ty = y + dy[i];
if(tx >= 0 && tx <= n && ty >= 0 && ty <= m){
a[tx][ty] = 1;//使用方向数组进行特征描述
}
}
dp[1][1] = 1;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(a[i][j]==1) continue;//如果是被阻拦,所以不去考虑
dp[i][j]+=dp[i-1][j]+dp[i][j-1];
}
}
cout<<dp[n][m];
return 0;
}
/*
在双重循环外直接初始化 dp[1][1] = 1,强制将起点的路径数设为 1。
然后在循环中,当遍历到 (i=1,j=1) 时,若该位置不是障碍物,会执行 dp[i][j] += dp[i-1][j] + dp[i][j-1]。
由于 dp[0][1] 和 dp[1][0] 是全局数组(默认初始化为 0),
因此实际效果是 dp[1][1] = 1 + 0 + 0 = 1(和初始值一致)。
循环外已强制将 dp[1][1] = 1,而循环中遇到 a[1][1] == 1 会 continue,因此 dp[1][1] 会保留错误的 1(实际障碍物的路径数应为 0)。
对非起点位置使用 dp[i][j] += dp[i-1][j] + dp[i][j-1](累加)。
由于 dp 数组初始为 0,首次计算时 += 和 = 效果相同(都是 0 + 上方路径数 + 左方路径数),但逻辑上冗余(不需要累加,直接赋值即可)。
*/
这里空空如也







有帮助,赞一个