设为首页 加入收藏

TOP

HDU5024Wang Xifeng's Little Plot(记忆化搜索)
2015-07-20 17:38:50 来源: 作者: 【 】 浏览:2
Tags:HDU5024Wang Xifeng' Little Plot 记忆 搜索

HDU5024Wang Xifeng's Little Plot(记忆化搜索)

题目链接

题目大意:给一张地图,#代表不能走的位置,.代表可以走的位置。现在要求找一条最长的路径,并且拐弯最多只能有一个并且还要是90度的。

解题思路:记忆化搜索,dp[x][y][k][d] : x, y 代表坐标,k代表拐了k次90弯,d代表方向。因为这里最多只能转一次弯,而且还必须是90度的,那么就不可能走重复的路了。

代码:

#include 
   
     #include 
    
      #include 
     
       #include 
      
        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; }
      
     
    
   
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇hdu 5024 Wang Xifeng's Litt.. 下一篇hdu-1078 FatMouse and Cheese(记..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·「链表」是一种怎样 (2025-12-25 19:20:51)
·C 语言中的链表有哪 (2025-12-25 19:20:48)
·c语言中的链表怎么学 (2025-12-25 19:20:45)
·Redis 分布式锁全解 (2025-12-25 17:19:51)
·SpringBoot 整合 Red (2025-12-25 17:19:48)