由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
JobHunting版 - 这题就够凶残的了吧
相关主题
电面题一个g 家面经
matrix question刚面的,发一个google新题
一道G题在Java,怎样做floating point number 的比较?
新鲜onsite面经ASCII字符发音总结
拿到offer,分享之前的一些onsite面试怎么计算一个网站过去5min的访问量?
AMAZON PHONE SCREEN 1 基本死掉。关于所谓的内推 我讲几点
leetcode wordsearch的时间复杂度?三道 Amazon Onsite Coding 题 (转载)
Leetcode Surrounded Regions Large Case Runtime ErrorAmazon 面经
相关话题的讨论汇总
话题: currentcol话题: currentrow话题: visited话题: maze
进入JobHunting版参与讨论
1 (共1页)
c****p
发帖数: 6474
h**6
发帖数: 4160
2
转坐标系,转45度解吧。
c****p
发帖数: 6474
3
关键不是坐标系的问题吧。。。怎么判断封闭呢?

【在 h**6 的大作中提到】
: 转坐标系,转45度解吧。
h**6
发帖数: 4160
4
凡是与边上一圈相邻的都不封闭。

【在 c****p 的大作中提到】
: 关键不是坐标系的问题吧。。。怎么判断封闭呢?
p*****p
发帖数: 379
5
哈,这不就是越南传说中全班会做的题?

【在 c****p 的大作中提到】
: http://neil.fraser.name/news/2013/03/16/
p*****p
发帖数: 379
6
不用吧,感觉就直接dfs就行了
两种45度方向定义了不同的边界限制

【在 h**6 的大作中提到】
: 转坐标系,转45度解吧。
p*****p
发帖数: 379
7
刚写了个,上个部分代码
private enum Direction {LEFT, RIGHT, UP, DOWN};
private static float getCurrentPathMax(int currentRow, int currentCol, int[]
[] maze, int[][] visited, Direction lastStep) {
int rows = maze.length, cols = maze[0].length;

if (currentRow < 0 || currentRow >= rows || currentCol < 0 || currentCol
>= cols) {
return -1;
}

if (maze[currentRow][currentCol] == 0) {
// blank
if (visited[currentRow][currentCol] == 3) {
return 0;
}
visited[currentRow][currentCol] = 3;
float nextPathArea = getCurrentPathMax(currentRow - 1, currentCol,
maze, visited, Direction.UP);
if (nextPathArea == -1) {
return -1;
}
else {
return 1 + nextPathArea;
}
}
else if (maze[currentRow][currentCol] == 1) {
// slash wall
float nextPathArea = 0;
switch (lastStep) {
case UP:
if ((visited[currentRow][currentCol] & 2) != 0) {
return 0;
}
visited[currentRow][currentCol] |= 2;
nextPathArea = getCurrentPathMax(currentRow, currentCol + 1,
maze, visited, Direction.RIGHT);
break;
case DOWN:
if ((visited[currentRow][currentCol] & 1) != 0) {
return 0;
}
visited[currentRow][currentCol] |= 1;
nextPathArea = getCurrentPathMax(currentRow, currentCol - 1,
maze, visited, Direction.LEFT);
break;
case LEFT:
if ((visited[currentRow][currentCol] & 2) != 0) {
return 0;
}
visited[currentRow][currentCol] |= 2;
nextPathArea = getCurrentPathMax(currentRow + 1, currentCol,
maze, visited, Direction.DOWN);
break;
case RIGHT:
if ((visited[currentRow][currentCol] & 1) != 0) {
return 0;
}
visited[currentRow][currentCol] |= 1;
nextPathArea = getCurrentPathMax(currentRow - 1, currentCol,
maze, visited, Direction.UP);
break;
}
if (nextPathArea == -1) {
return -1;
}
else {
return 0.5f + nextPathArea;
}

}
else {
// backslash wall
float nextPathArea = 0;
switch (lastStep) {
case UP:
if ((visited[currentRow][currentCol] & 2) != 0) {
return 0;
}
visited[currentRow][currentCol] |= 2;
nextPathArea = getCurrentPathMax(currentRow, currentCol - 1,
maze, visited, Direction.LEFT);
break;
case DOWN:
if ((visited[currentRow][currentCol] & 1) != 0) {
return 0;
}
visited[currentRow][currentCol] |= 1;
nextPathArea = getCurrentPathMax(currentRow, currentCol + 1,
maze, visited, Direction.RIGHT);
break;
case LEFT:
if ((visited[currentRow][currentCol] & 1) != 0) {
return 0;
}
visited[currentRow][currentCol] |= 1;
nextPathArea = getCurrentPathMax(currentRow - 1, currentCol,
maze, visited, Direction.UP);
break;
case RIGHT:
if ((visited[currentRow][currentCol] & 2) != 0) {
return 0;
}
visited[currentRow][currentCol] |= 2;
nextPathArea = getCurrentPathMax(currentRow + 1, currentCol,
maze, visited, Direction.DOWN);
break;
}
if (nextPathArea == -1) {
return -1;
}
else {
return 0.5f + nextPathArea;
}
}
}
public static float getMaxArea(int[][] maze) {
int rows = maze.length, cols = maze[0].length;
int[][] visited = new int[rows][cols];
// 0 - not visited
// 1 - upper half visited
// 2 - lower half visited
for (int i = 0; i < rows; ++i) {
for (int j = 0; j < cols; ++j) {
visited[i][j] = 0;
}
}

float max = 0;

for (int i = 0; i < rows; ++i) {
for (int j = 0; j < cols; ++j) {
if (visited[i][j] == 3) {
continue;
}
if (maze[i][j] == 0) {
continue;
}
else {
if ((visited[i][j] & 1) == 0) {
visited[i][j] |= 1;
max = Math.max(max, 0.5f + getCurrentPathMax(i - 1, j,
maze, visited, Direction.UP));
}
if ((visited[i][j] & 2) == 0) {
visited[i][j] |= 2;
max = Math.max(max, 0.5f + getCurrentPathMax(i + 1, j,
maze, visited, Direction.DOWN));
}
}
}
}

return max;
}
d*******l
发帖数: 338
8
这个题如果是方格且四周全封闭就是个简单的问题。现在这样虽然也可以那么做,不过
倒下标加边界判断,一般人写起来会很容易出错吧。我觉得把每个格分成四个顶点,然
后建起图,挨个dfs,是最稳定扎实的办法。把最外圈的点跟一个面积负无穷的点连起
来,也就不用单独判断封闭了。
j*****y
发帖数: 1071
9
感觉就是用 dfs找出所有的 cycle .但是找所有的 cycle也不太容易阿

【在 d*******l 的大作中提到】
: 这个题如果是方格且四周全封闭就是个简单的问题。现在这样虽然也可以那么做,不过
: 倒下标加边界判断,一般人写起来会很容易出错吧。我觉得把每个格分成四个顶点,然
: 后建起图,挨个dfs,是最稳定扎实的办法。把最外圈的点跟一个面积负无穷的点连起
: 来,也就不用单独判断封闭了。

b*****n
发帖数: 482
10
上个月刚做过,uva 705,slash maze,有兴趣的可以直接去online judge submit。应
该属于国内搞IO和ACM的基础练习题。
1 (共1页)
进入JobHunting版参与讨论
相关主题
Amazon 面经拿到offer,分享之前的一些onsite面试
请教一道面试题,判断迷宫有没有解AMAZON PHONE SCREEN 1 基本死掉。
问个面试题leetcode wordsearch的时间复杂度?
这题咋做?Leetcode Surrounded Regions Large Case Runtime Error
电面题一个g 家面经
matrix question刚面的,发一个google新题
一道G题在Java,怎样做floating point number 的比较?
新鲜onsite面经ASCII字符发音总结
相关话题的讨论汇总
话题: currentcol话题: currentrow话题: visited话题: maze