首页 > 代码库 > HDU5024Wang Xifeng's Little Plot(记忆化搜索)
HDU5024Wang Xifeng's Little Plot(记忆化搜索)
HDU5024Wang Xifeng‘s Little Plot(记忆化搜索)
题目链接
题目大意:给一张地图,#代表不能走的位置,.代表可以走的位置。现在要求找一条最长的路径,并且拐弯最多只能有一个并且还要是90度的。
解题思路:记忆化搜索,dp[x][y][k][d] : x, y 代表坐标,k代表拐了k次90弯,d代表方向。因为这里最多只能转一次弯,而且还必须是90度的,那么就不可能走重复的路了。
代码:
#include <cstdio>
#include <cstring>
#include <queue>
#include <cstdlib>
using namespace std;
const int N = 105;
const int M = 8;
const int dir[M][2] = {{-1, 0},{-1, 1}, {0, -1}, {1, 1},
{1, 0}, {1, -1}, {0, -1}, {-1, -1}};
char rec[N][N];
int n;
int f[N][N][M][2];
void init () {
for (int i = 0; i <= n; i++)
for (int j = 0; j <= n; j++)
for (int d = 0; d < M; d++)
for (int k = 0; k < 2; k++)
f[i][j][d][k] = -1;
}
int dp (int x, int y, int k, int d) {
if (f[x][y][d][k] != -1)
return f[x][y][d][k];
int nx, ny;
for (int i = 0; i < M; i++) {
nx = x + dir[i][0];
ny = y + dir[i][1];
if (nx < 0 || nx >= n || ny < 0 || ny >= n)
continue;
if (rec[nx][ny] == ‘#‘)
continue;
if (i == d)
f[x][y][d][k] = max (dp(nx, ny, k, d) + 1, f[x][y][d][k]);
else if (!k && (abs(i - d) == 2 || abs (i - d) == 6))
f[x][y][d][k] = max (dp(nx, ny, k + 1, i) + 1, f[x][y][d][k]);
}
if (f[x][y][d][k] == -1)
f[x][y][d][k] = 1;
return f[x][y][d][k];
}
int main () {
while (scanf ("%d", &n) && n) {
for (int i = 0; i < n; i++)
scanf ("%s", rec[i]);
int ans = -1;
init();
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++) {
if (rec[i][j] == ‘.‘) {
for (int d = 0; d < M; d++)
ans = max (ans, dp(i, j, 0, d));
}
}
printf ("%d\n", ans);
}
return 0;
}
HDU5024Wang Xifeng's Little Plot(记忆化搜索)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。