P1002 [NOIP2002 普及组] 过河卒(洛谷)
分析如下:(注意棋盘的越界问题)
C++代码:
#include <iostream>
using namespace std;
const int MAXN=20+2;
const int MAXM=20+2;
bool vis[MAXN][MAXM];//全局变量会被初始化为0,false表示可以走
long long ans[MAXN][MAXM];//到某个点的所有走法
int main(){
int n=0,m=0;//棋盘大小
int x=0,y=0;//马的坐标
cin>>n>>m>>x>>y;
//处理马控制的点
vis[x][y]=true;//(x,y)不能走
const int moves[8][2]={{1,-2},{2,-1},{2,1},{1,2},{-1,2},{-2,1},{-2,-1},{-1,-2}};
for(int i=0;i<8;i++){
int newX=x+moves[i][0];
int newY=y+moves[i][1];
if(newX>=0&&newX<=n&&newY>=0&&newY<=m){//必须要在棋盘内
vis[newX][newY]=true;//不能走
}
}
for(int i=0;i<=n;i++){
for(int j=0;j<=m;j++){
if(vis[i][j]==true){
ans[i][j]=0;
}else if(i==0&&j==0){//特殊情况:原点
ans[i][j]=1;
}else if(i==0&&j!=0){//特殊情况:y轴
ans[i][j]=ans[i][j-1];
}else if(i!=0&&j==0){//特殊情况:x轴
ans[i][j]=ans[i-1][j];
}else{//一般情况
ans[i][j]=ans[i-1][j]+ans[i][j-1];
}
}
}
cout<<ans[n][m]<<endl;
return 0;
}
若有疑问,可以看这个视频,讲的非常清楚,很棒
觉得还不错的朋友,点个赞吧,谢谢!
不懂的可以在下方留言,看到后会回复