1 条题解
-
0
题意分析
奶牛在5×5的数字网格中跳跃,每次只能向上下左右移动(不能斜向),经过5次跳跃后形成一个6位数字(允许前导零)。要求计算所有可能的不同6位数字的数量。
关键思路
-
深度优先搜索(DFS):
从每个网格点出发,进行深度优先搜索,记录当前路径形成的数字。每次移动时,向四个方向扩展,直到形成6位数字为止。 -
集合去重:
使用集合(Set)存储所有生成的6位数字,利用集合的自动去重特性,最终集合的大小即为不同数字的数量。 -
状态转移:
- 状态参数:当前坐标
(x, y)
、已形成的数字长度step
、当前数字num
。 - 转移逻辑:每次移动到相邻格子,将新数字位添加到
num
中(num = num * 10 + grid[tx][ty]
),直到step = 6
时将数字存入集合。
- 状态参数:当前坐标
代码实现
#include <iostream> #include <set> using namespace std; const int n = 5; // 5x5网格 int dt[][2] = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}}; // 四个方向 set<int> numbers; // 存储不同的6位整数 int grid[n][n]; // 数字网格 // 深度优先搜索函数 void dfs(int x, int y, int step, int num) { if (step == 6) { // 形成6位数字时结束 numbers.insert(num); return; } // 遍历四个方向 for (int i = 0; i < 4; i++) { int tx = x + dt[i][0]; int ty = y + dt[i][1]; // 检查坐标是否在网格内 if (tx >= 0 && tx < n && ty >= 0 && ty < n) { // 递归扩展数字长度,并更新当前数字 dfs(tx, ty, step + 1, num * 10 + grid[tx][ty]); } } } int main() { // 读取网格数据 for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { cin >> grid[i][j]; } } // 从每个格子出发进行DFS for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { dfs(i, j, 1, grid[i][j]); // 初始数字为grid[i][j],长度为1 } } // 输出不同数字的数量 cout << numbers.size() << endl; return 0; }
代码解析
-
输入处理:
读取5×5的网格数据,存储在二维数组grid
中。 -
DFS遍历:
- 从每个格子
(i, j)
出发,初始数字为grid[i][j]
,长度step=1
。 - 每次递归时,向四个方向移动,更新坐标
(tx, ty)
,并将新数字位拼接到num
中(如当前数字为12
,移动到数字3
的格子后,新数字为123
)。 - 当
step=6
时,将完整的6位数字存入集合numbers
中。
- 从每个格子
-
去重与结果:
集合numbers
自动处理重复数字,最终输出集合的大小即为不同数字的数量。
复杂度分析
- 时间复杂度:每个格子作为起点,最多扩展次(每次移动有4种方向,共5次跳跃)。总共有25个起点,因此总时间复杂度为 ,完全可接受。
- 空间复杂度:最坏情况下存储所有可能的6位数字(种),但实际中由于网格限制,数量远小于此,集合的空间占用可控。
该方法通过深度优先搜索和集合去重,高效地解决了问题,确保了在合理时间内得到正确结果。
-
- 1
信息
- ID
- 2051
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者