#include <iostream>
#include <vector>
using namespace std;
const int MAX = 51;
int m, n, k;
int grid[MAX][MAX]; // 用于记录每个格子是否有黄金,1表示有黄金,0表示没有或已访问
int dx[] = { -1, 0, 1, 0 }; // 上下左右四个方向的横坐标偏移量
int dy[] = { 0, 1, 0, -1 }; // 上下左右四个方向的纵坐标偏移量
//能取得的黄金数
static int total = 0;
bool isValidCell(int x, int y) {
// 判断当前坐标是否在地图范围内
//return x >= 0 && x < n && y >= 0 && y < m;
return x >= 0 && x < m && y >= 0 && y < n;
}
// 计算数字的数位之和
int digitSum(int num) {
int sum = 0;
while (num) {
sum += num % 10;
num /= 10;
}
return sum;
}
void initializeGrid() {
// 根据题目条件初始化地图,只有坐标数位之和不大于k的格子才初始化为有黄金
for (int i = 0; i < m; ++i) {
for (int j = 0; j < n; ++j) {
if (digitSum(i) + digitSum(j) <= k) {
grid[i][j] = 1; // 满足条件的格子设为有黄金
}
else {
grid[i][j] = 0; // 其他格子默认无黄金或视为障碍
}
}
}
}
int dfs(int x, int y) {
//cout << x << " " << y << endl; // 输出所有遍历过的网格坐标
// 深度优先搜索获取最多黄金数量
if (!isValidCell(x, y)) return 0; // 不安全的位置返回0
if (grid[x][y] == 0) return 0; // 已访问过或没有黄金的位置返回0
grid[x][y] = 0; // 标记为已访问
//int maxGold = 0;
for (int i = 0; i < 4; ++i) {
int newX = x + dx[i];
int newY = y + dy[i];
//maxGold = max(maxGold, dfs(newX, newY)); // 递归探索四周并取最大值
dfs(newX, newY);
//cout << newX << " " << newY << " -" << endl; // 输出所有遍历过的网格坐标
}
total++;
//cout << x << " " << y << " +" << endl; // 输出所有遍历过的网格坐标
return 0; // 加上当前位置的黄金
}
int main() {
cin >> m >> n >> k;
initializeGrid(); // 根据k值初始化地图
dfs(0, 0);
cout << total << endl; // 从(0,0)开始搜索
return 0;
}
编程练习10 小华地图寻宝
最新推荐文章于 2025-02-12 15:44:59 发布