题目背景
西西艾弗岛某山脉深处出土了一台远古机器人,具体年代已不可考。初步修缮后,研究人员尝试操控机器人进行些简单的移动。
题目描述
整个实验场地被划分为 n×n 个方格,从 (1,1) 到 (n,n) 进行编号。机器人只能在这些方格间移动,不能走出场地范围。
假设机器人当前位于 (x,y),接下来可以向特定方向跳跃移动(如果目标方格在场地范围内)。根据样例数据反推,这里的移动规则并非相邻八格,而是类似国际象棋中'马'的走法(横纵坐标偏移分别为 1 和 2)。

若机器人只能跳动不超过 k 步,场地内有多少方格(包括起始位置)可以抵达?
输入格式
从标准输入读入数据。 输入的第一行包含空格分隔的两个正整数 n 和 k,分别表示场地大小和跳动步数。 输入的第二行包含空格分隔的两个正整数 x 和 y,表示机器人的起始位置(保证位于场地内)。
输出格式
输出到标准输出。 输出一个整数,表示 k 步内可以抵达的方格总数。
样例 1 输入
4 1 1 1
样例 1 输出
3
样例 2 输入
4 2 1 1
样例 2 输出
8
样例 2 解释
初始位置、第一步和第二步跳跃抵达的位置总计为 8。

子任务
80% 的测试数据满足:k≤3; 全部的测试数据满足:n、k 均大于 0 且不超过 100。
解题思路
这道题本质上是一个典型的图遍历问题。我们需要统计在限制步数 k 内,从起点出发能到达的所有不同状态(方格)。
对于这种网格搜索,DFS(深度优先搜索)和 BFS(广度优先搜索)都是可行的方案。考虑到代码实现的简洁性,这里以 DFS 为例。
核心逻辑
在 DFS 实现中,步数作为递归函数的参数传递;而在 BFS 实现中,步数需要作为队列元素的附加参数存储。无论哪种方式,关键在于记录访问状态,避免重复计数。
实现细节
- 方向数组:由于移动规则是类似'马'的跳法,我们定义 dx 和 dy 数组来覆盖所有 8 种可能的跳跃组合。
- 边界判断:每次移动前必须检查新坐标是否在 1 到 n 之间,防止越界。
- 访问标记:使用 st 数组记录已访问过的方格,确保每个方格只被计算一次。
- 计数器:全局变量 cnt 用于统计已访问节点的数量,注意这包括了起始位置。
代码实现
#include <bits/stdc++.h>
std;
N = ;
n, k, x, y;
st[N][N];
dx[] = {, , , , , , , };
dy[] = {, , , , , , , };
cnt;
{
st[x][y] = ;
cnt++;
(num == k) ;
( i = ; i < ; i++) {
nx = x + dx[i], ny = y + dy[i];
(nx >= && nx <= n && ny >= && ny <= n && !st[nx][ny]) {
(nx, ny, num + );
}
}
}
{
cin >> n >> k >> x >> y;
(x, y, );
cout << cnt;
;
}

