题意:给出一个迷宫,让你设计起点和终点,使起点到终点最多转一个直角弯,且起点到终点的距离最大。
思路:因为地图不大,我们可以枚举转折点,然后,枚举方向,记忆化搜索即可 。
注意:貌似数据有点弱
代码如下:
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int MAX = 110;
int dx[] = {0,-1,0,1,-1,-1,1,1};
int dy[] = {-1,0,1,0,-1,1,1,-1};
int dp[MAX][MAX][8];
char maze[MAX][MAX];
int N;
int dfs(int x, int y, int d)
{
if(dp[x][y][d] != 0)
return dp[x][y][d];
int xx = x + dx[d], yy = y + dy[d];
if(xx >= 0 && xx < N && yy >= 0 && yy < N
&& maze[xx][yy] == '.')
return dp[x][y][d] = 1 + dfs(xx,yy,d);
else
return 1;
}
int main(void)
{
//freopen("input.txt","r",stdin);
//freopen("out.txt","w",stdout);
while(scanf("%d", &N), N){
for(int i = 0; i < N; ++i)
scanf("%s",maze[i]);
memset(dp,0,sizeof(dp));
int ans = 0;
for(int i = 0; i < N; ++i){
for(int j = 0; j < N; ++j){
if(maze[i][j] == '.'){
for(int u = 0; u < 4; ++u){
int v = (u+1) % 4;//right angle
ans = max(ans,dfs(i,j,u)+dfs(i,j,v)-1);
ans = max(ans,dfs(i,j,u+4)+dfs(i,j,v+4)-1);
}
}
}
}
printf("%d\n",ans);
}
return 0;
}