题目描述:棋盘上 A 点有一个过河卒,需要走到目标 B 点。卒行走的规则:可以向下、或者向右。同时在棋盘上 C 点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点。棋盘用坐标表示,A点 (0, 0)、B点 (n, m),同样马的位置坐标是需要给出的。
代码以及分析:
#include<iostream>
using namespace std;
int main(){
//数组d用来计算B坐标的路径,数组f作为映射数组。都先全部初始化为0,f[0][0] = true,象棋马覆盖区域的点也为true,在f[i][j] == false条件下:如果i不为0,执行f[i][j] = f[i][j] + f[i - 1][j];如果j不为0,执行f[i][j] = f[i][j] + f[i][j - 1]。
//B的坐标
int m,n;
//马的坐标
int cx,cy;
//输入坐标
cin>>m>>n>>cx>>cy;
int f[20][20] = {0};
f[0][0] = true;
int d[20][20] = {0};
f[cx][cy] = true;
//x,y数组分别表示为象棋马在原位置基础上能够跳跃的点的坐标。注意,x方向向下,y方向向右
int x[8] = {-2,-2,-1,-1,1,1,2,2};
int y[8] = {-1,1,-2,2,-2,2,-1,1};
for(int i = 0;i < 8;i++){
int xx = cx + x[i];
int yy = cy + y[i];
if(xx >= 0 && yy >= 0 && xx <= m && yy <= n){
f[xx][yy] = true;
}
}
d[0][0] = 1;
for(int i = 0;i <= m;i++) {
for (int j = 0; j <= n; j++) {
cout<<f[i][j];
}
cout<<"\n";
}
for(int i = 0;i <= m;i++){
for(int j = 0;j <= n;j++){
if(f[i][j] == false) {
if (i != 0) {
d[i][j] = d[i][j] + d[i - 1][j];
}
if (j != 0) {
d[i][j] = d[i][j] + d[i][j - 1];
}
}
}
}
cout<<d[m][n];
return 0;
}