c语言洛谷p1002过河卒
时间: 2023-12-21 14:30:59 浏览: 118
以下是C语言洛谷p1002过河卒的代码实现和注释解析:
```c
#include <stdio.h>
#define MAX 21 // 定义最大值
int main()
{
int n, m, xh, yh, i, j, k;
long long map[MAX][MAX] = {0}; // 定义地图,初始化为0
scanf("%d %d %d %d", &n, &m, &xh, &yh); // 输入信息
map[xh][yh] = -1; // 标记障碍物
for (k = 0; k < 3; k++) { // 遍历3个方向
switch (k) {
case 0: i = 2; j = 1; break; // 方向1
case 1: i = 1; j = 2; break; // 方向2
case 2: i = 1; j = 1; break; // 方向3
}
if (xh - i >= 0 && yh - j >= 0) { // 判断是否越界
map[xh - i][yh - j] = -1; // 标记障碍物
}
if (xh + i <= n && yh + j <= m) { // 判断是否越界
map[xh + i][yh + j] = -1; // 标记障碍物
}
}
map[0][0] = 1; // 起点为1
for (i = 0; i <= n; i++) { // 遍历行
for (j = 0; j <= m; j++) { // 遍历列
if (map[i][j] != -1) { // 判断是否为障碍物
if (map[i - 1][j] != -1) { // 上可通过
map[i][j] += map[i - 1][j]; // 累加上方格子的值
}
if (map[i][j - 1] != -1) { // 左可通过
map[i][j] += map[i][j - 1]; // 累加左方格子的值
}
}
}
}
printf("%lld\n", map[n][m]); // 输出结果
return 0;
}
```
注释解析:
1. 定义了一个二维数组`map`,用于存储地图信息,初始化为0。
2. 输入了4个整数,分别为地图的行数`n`、列数`m`、卒的初始位置`xh`、`yh`。
3. 标记了障碍物,即卒不能到达的位置。
4. 遍历了3个方向,分别为向上走2步、向左走1步;向上走1步、向左走2步;向上走1步、向左走1步。如果卒可以到达该位置,则标记为障碍物。
5. 起点的值为1,表示只有一种走法。
6. 遍历整个地图,如果该位置不是障碍物,则累加上方格子和左方格子的值。
7. 输出结果,即终点的值。
阅读全文