您的位置:首页 > 其它

hdoj 5024 枚举+dfs

2015-08-07 11:32 190 查看
hdoj 5024

题意:找一条最长的最多有一个90度拐点的路径,输出长度。

思路:枚举所有点做拐点,dfs最长路径。

#include <cstdio>
#include <queue>
#include <cstring>
#include <algorithm>
using namespace std;
int d[8][2] = {1, 0, -1, 0, 0, 1, 0, -1, 1, 1, -1, -1, 1, -1, -1, 1};
int turn[8][2] = {2, 3, 2, 3, 0, 1, 0, 1, 6, 7, 6, 7, 4, 5, 4, 5};
int mx[105][105][8], n;
char mp[105][105];
int dfs(int x, int y, int dir) {
if(mx[x][y][dir] != -1) return mx[x][y][dir];
int ex = x + d[dir][0], ey = y + d[dir][1];
if(ex < 0 || ey < 0 || ex >= n || ey >= n || mp[ex][ey] == '#')
return mx[x][y][dir] = 1;
return mx[x][y][dir] = 1 + dfs(x + d[dir][0], y + d[dir][1], dir);

}
int cal(int x, int y, int d1, int d2) {
return dfs(x, y, d1) + dfs(x, y, d2) - 1;
}
main() {
while(~scanf("%d", &n) && n) {
memset(mx, -1, sizeof mx);
int ans = 0;
for(int i = 0; i < n; i++) scanf("%s", mp[i]);
for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++) {
if(mp[i][j] == '#') continue;
for(int k = 0; k < 8; k++){
ans = max(ans, max(cal(i, j, k, turn[k][0]), cal(i, j, k, turn[k][1])));
}
}
}
printf("%d\n", ans);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: