hdu5024 Wang Xifeng's Little Plot记忆化搜索

来源:互联网 发布:模拟战争软件 编辑:程序博客网 时间:2024/04/30 02:04

传送门:hdu5024

题意:求从图中任意一点出发的最长路(只能拐一次弯)

一开始自己写的枚举每个点然后TLE,看了题解才发现自己思维太僵化了。。应该枚举拐点,枚举每个点的两两成直角的方向。这其中又加入了一个记忆数组dp[i][j][dir],用来记录i,j点在dir方向最多能走多远,直接将时间优化到0ms。。

#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>char map[105][105];int go[8][2]={{0,1},{1,1},{1,0},{1,-1},{0,-1},{-1,-1},{-1,0},{-1,1}};int dp[105][105][8];int n;int ans=0;using namespace std;int dfs(int x,int y,int dir)//行、列、方向{if(dp[x][y][dir]!=0)return dp[x][y][dir];if(map[x+go[dir][0]][y+go[dir][1]]=='.')return dp[x][y][dir]=1+dfs(x+go[dir][0],y+go[dir][1],dir);return dp[x][y][dir]=1;}int main(){while(scanf("%d",&n)&&n){ans=0;getchar();memset(map,0,sizeof(map));memset(dp,0,sizeof(dp));for(int i=0;i<n;i++)gets(map[i]);int t=0;for(int i=0;i<n;i++){for(int j=0;j<n;j++)if(map[i][j]=='.')//枚举每个点当拐点的所有情况{for(int k=0;k<=7;k++){t=dfs(i,j,k)+dfs(i,j,(k+2)%8)-1;if(t>ans)ans=t;}}}printf("%d\n",ans);}return 0;}


0 0
原创粉丝点击