空间探索 求调

#include <iostream>
#include <climits>

struct st
{
	int x, y;
} const move[4] =
{
	{ 0, -1 },
	{ -1, 0 },
	{ 1, 0 },
	{ 0, 1 }
};

int search(int*** const all, int*** const answer, const int& x_size, const int& y_size, const int& limit, const st& start)
{
	if (limit <= 0)
	{
		return 0;
	}
	
	if (answer[start.x][start.y][limit] == -1) // 如果不曾访问过
	{
		int min_count = INT_MAX;

		for (int a = 0; a < 4; a++) // 遍历去往方向
		{
			int now_x = start.x + move[a].x, now_y = start.y + move[a].y; // 新的坐标

			if (now_x >= 0 && now_x < x_size && now_y >= 0 && now_y < y_size) // 如果可以访问
			{
				int count = search(all, answer, x_size, y_size, limit - 2, { now_x, now_y }); // 存储这个方向能遍历到的最小值

				min_count = count + 2 * all[start.x][start.y][a] < min_count ? count + 2 * all[start.x][start.y][a] : min_count; // 取最小值
			}
		}

		answer[start.x][start.y][limit] = min_count; // 更新记忆
	}

	return answer[start.x][start.y][limit]; // 返回
}

int main()
{
	int n, m, k;
	std::cin >> n >> m >> k;

	int*** all = new int** [n];
	int*** answer = new int** [n];
	for (int a = 0; a < n; a++)
	{
		all[a] = new int* [m];
		answer[a] = new int* [m];

		for (int b = 0; b < m; b++)
		{
			all[a][b] = new int[4] { -1, -1, -1, -1 };
			answer[a][b] = new int[k + 1];
			
			for (int c = 0; c <= k; c++)
			{
				answer[a][b][c] = -1;
			}
		}
	}

	for (int a = 0; a < n; a++)
	{
		for (int b = 0; b < m - 1; b++)
		{
			int value;
			std::cin >> value;

			all[a][b][2] = value;
			all[a][b + 1][1] = value;
		}
	}

	for (int b = 0; b < m; b++)
	{
		for (int a = 0; a < n - 1; a++)
		{
			int value;
			std::cin >> value;

			all[a][b][3] = value;
			all[a + 1][b][0] = value;
		}
	}

	for (int a = 0; a < n; a++)
	{
		for (int b = 0; b < m; b++)
		{
			if (k % 2 == 0)
			{
				std::cout << search(all, answer, n, m, k, { a, b }) << ' ';
			}
			else
			{
				std::cout << -1 << ' ';
			}
		}
		std::cout << std::endl;
	}
}

样例过不了