请求带有 Google Foobar 问题的反测试用例 - 准备 Bunnies Escape
Request for Counter Testcase with Google Foobar Question - Prepare the Bunnies Escape
我最近遇到了 GoogleFoobar 的问题准备 Bunnies Escape,我提交了一个基于最短路径的解决方案。
然而,只有三分之五的案例通过了,我真的很想知道为什么。
我在下面附上了我的代码以供参考。
如果有人可以"Hack"我的解决方案/提供反例/告诉我我做错了什么,那将不胜感激。
请不要向我发送实现,如果对我的错误/反测试进行口头解释,我们将不胜感激。
谢谢。
import java.util.PriorityQueue;
public class Solution
{
public static int ans = Integer.MAX_VALUE;
public static int dx [] = {0,0,-1,1};
public static int dy [] = {-1,1,0,0};
static class State implements Comparable<State>
{
int x,y,moves;
boolean wentThroughWall;
public State(int x, int y, int moves, boolean wentThroughWall)
{
this.x = x;
this.y = y;
this.moves = moves;
this.wentThroughWall = wentThroughWall;
}
public int compareTo(State other)
{
return moves - other.moves;
}
}
public static int solution(int[][] map)
{
PriorityQueue<State> enque = new PriorityQueue<State>();
boolean visited [][] = new boolean [map.length][map[0].length];
enque.add(new State(0, 0, 1,false));
while(!enque.isEmpty())
{
State top = enque.poll();
if(top.x == map.length - 1 && top.y == map[0].length - 1)
{
ans = Math.min(ans, top.moves);
continue;
}
if(visited[top.x][top.y])
continue;
visited[top.x][top.y] = true;
for(int i = 0; i < dx.length; i++)
{
int nx = top.x + dx[i];
int ny = top.y + dy[i];
if(nx < 0 || nx >= map.length || ny < 0 || ny >= map[0].length || (map[nx][ny] == 1 && top.wentThroughWall))
continue;
if(map[nx][ny] == 1)
enque.add(new State(nx, ny, top.moves + 1, true));
else
enque.add(new State(nx, ny, top.moves + 1, top.wentThroughWall));
}
}
return ans;
}
public static void main(String[] args) {
int [][] test = {{0, 0, 0, 0, 0, 0}, {1, 1, 1, 1, 1, 0}, {0, 0, 0, 0, 0, 0}, {0, 1, 1, 1, 1, 1}, {0, 1, 1, 1, 1, 1}, {0, 0, 0, 0, 0, 0}};
System.out.println(Solution.solution(test));
}
}
声明:
你非常接近摧毁 LAMBCHOP 世界末日装置并释放指挥官 Lambda 的兔子囚犯,但是一旦他们离开监狱街区,兔子将需要通过逃生通道 [=59] 逃离 Lambda 的 space 站=] 尽快。不幸的是,space 车站的大厅是一个迷宫般的走廊和死胡同,对于逃跑的兔子来说将是一个死亡陷阱。幸运的是,Lambda 指挥官让你负责一个改造项目,这将使你有机会让兔子们的生活变得更轻松一些。不幸的是(再一次),你不能只移除兔子和逃生之间的所有障碍物 pods - 最多你可以移除每个逃生舱路径的一堵墙,既要保持空间站的结构完整性又要避免唤醒指挥官Lambda 的怀疑。
您有 space 车站部分区域的地图,每个区域都从监狱出口开始,到逃生舱门口结束。地图表示为 0 和 1 的矩阵,其中 0 是可通行的 space,1 是不可通行的墙。离开监狱的门在左上角 (0,0),进入逃生舱的门在右下角 (w-1,h-1)。
编写一个函数解决方案(地图),生成从监狱门到逃生舱的最短路径的长度,作为改造计划的一部分,您可以拆除一堵墙。路径长度是您经过的节点总数,包括入口节点和出口节点。起始位置和结束位置总是可以通过的 (0)。地图将始终是可解的,尽管您可能需要也可能不需要移除一堵墙。地图的高度和宽度可以从 2 到 20。只能在基本方向上移动;不允许对角线移动。
语言
要提供 Python 解决方案,请编辑 solution.py
要提供 Java 解决方案,请编辑 Solution.java
测试用例
您的代码应该通过以下测试用例。
请注意,它也可能 运行 针对此处未显示的隐藏测试用例。
-- Python 个案例 --
输入:
solution.solution([[0, 1, 1, 0], [0, 0, 0, 1], [1, 1, 0, 0], [1, 1, 1, 0]])
输出:
7
输入:
solution.solution([[0, 0, 0, 0, 0, 0], [1, 1, 1, 1, 1, 0], [0, 0, 0, 0, 0, 0], [ 0, 1, 1, 1, 1, 1], [0, 1, 1, 1, 1, 1], [0, 0, 0, 0, 0, 0]])
输出:
11
-- Java 个案例 --
输入:
Solution.solution({{0, 1, 1, 0}, {0, 0, 0, 1}, {1, 1, 0, 0}, {1, 1, 1, 0}})
输出:
7
输入:
Solution.solution({{0, 0, 0, 0, 0, 0}, {1, 1, 1, 1, 1, 0}, {0, 0, 0, 0, 0, 0}, { 0, 1, 1, 1, 1, 1}, {0, 1, 1, 1, 1, 1}, {0, 0, 0, 0, 0, 0}})
输出:
11
咳咳,我修好了。我设法使用随机测试用例生成器生成了一堆测试用例,并意识到我访问的数组定义不正确。
我在下面列出了正确的解决方案以供参考。
import java.util.PriorityQueue;
public class Solution
{
public static int ans = Integer.MAX_VALUE;
public static int dx [] = {0,0,-1,1};
public static int dy [] = {-1,1,0,0};
static class State implements Comparable<State>
{
int x,y,moves;
boolean wentThroughWall;
public State(int x, int y, int moves, boolean wentThroughWall)
{
this.x = x;
this.y = y;
this.moves = moves;
this.wentThroughWall = wentThroughWall;
}
public int compareTo(State other)
{
return moves - other.moves;
}
}
public static int solution(int[][] map)
{
PriorityQueue<State> enque = new PriorityQueue<State>();
boolean visited [][][] = new boolean [map.length][map[0].length][2];
enque.add(new State(0, 0, 1,false));
while(!enque.isEmpty())
{
State top = enque.poll();
if(top.x == map.length - 1 && top.y == map[0].length - 1)
{
ans = Math.min(ans, top.moves);
continue;
}
if(visited[top.x][top.y][(top.wentThroughWall ? 0 : 1)])
continue;
visited[top.x][top.y][(top.wentThroughWall ? 0 : 1)] = true;
for(int i = 0; i < dx.length; i++)
{
int nx = top.x + dx[i];
int ny = top.y + dy[i];
if(nx < 0 || nx >= map.length || ny < 0 || ny >= map[0].length || (map[nx][ny] == 1 && top.wentThroughWall))
continue;
if(map[nx][ny] == 1)
enque.add(new State(nx, ny, top.moves + 1, true));
else
enque.add(new State(nx, ny, top.moves + 1, top.wentThroughWall));
}
}
assert(ans != Integer.MAX_VALUE);
return ans;
}
public static void main(String[] args) {
int [][] test = {{0, 0, 0, 0, 0, 0}, {1, 1, 1, 1, 1, 0}, {0, 0, 0, 0, 0, 0}, {0, 1, 1, 1, 1, 1}, {0, 1, 1, 1, 1, 1}, {0, 0, 0, 0, 0, 0}};
System.out.println(Solution.solution(test));
}
}
作为一个有竞争力的人,我想知道我的代码是否真的有效,或者只是弱测试。
如果您发现一个测试用例破坏了我的代码,请在评论中告诉我,我会尽快回复您。
我最近遇到了 GoogleFoobar 的问题准备 Bunnies Escape,我提交了一个基于最短路径的解决方案。
然而,只有三分之五的案例通过了,我真的很想知道为什么。
我在下面附上了我的代码以供参考。
如果有人可以"Hack"我的解决方案/提供反例/告诉我我做错了什么,那将不胜感激。
请不要向我发送实现,如果对我的错误/反测试进行口头解释,我们将不胜感激。
谢谢。
import java.util.PriorityQueue;
public class Solution
{
public static int ans = Integer.MAX_VALUE;
public static int dx [] = {0,0,-1,1};
public static int dy [] = {-1,1,0,0};
static class State implements Comparable<State>
{
int x,y,moves;
boolean wentThroughWall;
public State(int x, int y, int moves, boolean wentThroughWall)
{
this.x = x;
this.y = y;
this.moves = moves;
this.wentThroughWall = wentThroughWall;
}
public int compareTo(State other)
{
return moves - other.moves;
}
}
public static int solution(int[][] map)
{
PriorityQueue<State> enque = new PriorityQueue<State>();
boolean visited [][] = new boolean [map.length][map[0].length];
enque.add(new State(0, 0, 1,false));
while(!enque.isEmpty())
{
State top = enque.poll();
if(top.x == map.length - 1 && top.y == map[0].length - 1)
{
ans = Math.min(ans, top.moves);
continue;
}
if(visited[top.x][top.y])
continue;
visited[top.x][top.y] = true;
for(int i = 0; i < dx.length; i++)
{
int nx = top.x + dx[i];
int ny = top.y + dy[i];
if(nx < 0 || nx >= map.length || ny < 0 || ny >= map[0].length || (map[nx][ny] == 1 && top.wentThroughWall))
continue;
if(map[nx][ny] == 1)
enque.add(new State(nx, ny, top.moves + 1, true));
else
enque.add(new State(nx, ny, top.moves + 1, top.wentThroughWall));
}
}
return ans;
}
public static void main(String[] args) {
int [][] test = {{0, 0, 0, 0, 0, 0}, {1, 1, 1, 1, 1, 0}, {0, 0, 0, 0, 0, 0}, {0, 1, 1, 1, 1, 1}, {0, 1, 1, 1, 1, 1}, {0, 0, 0, 0, 0, 0}};
System.out.println(Solution.solution(test));
}
}
声明: 你非常接近摧毁 LAMBCHOP 世界末日装置并释放指挥官 Lambda 的兔子囚犯,但是一旦他们离开监狱街区,兔子将需要通过逃生通道 [=59] 逃离 Lambda 的 space 站=] 尽快。不幸的是,space 车站的大厅是一个迷宫般的走廊和死胡同,对于逃跑的兔子来说将是一个死亡陷阱。幸运的是,Lambda 指挥官让你负责一个改造项目,这将使你有机会让兔子们的生活变得更轻松一些。不幸的是(再一次),你不能只移除兔子和逃生之间的所有障碍物 pods - 最多你可以移除每个逃生舱路径的一堵墙,既要保持空间站的结构完整性又要避免唤醒指挥官Lambda 的怀疑。
您有 space 车站部分区域的地图,每个区域都从监狱出口开始,到逃生舱门口结束。地图表示为 0 和 1 的矩阵,其中 0 是可通行的 space,1 是不可通行的墙。离开监狱的门在左上角 (0,0),进入逃生舱的门在右下角 (w-1,h-1)。
编写一个函数解决方案(地图),生成从监狱门到逃生舱的最短路径的长度,作为改造计划的一部分,您可以拆除一堵墙。路径长度是您经过的节点总数,包括入口节点和出口节点。起始位置和结束位置总是可以通过的 (0)。地图将始终是可解的,尽管您可能需要也可能不需要移除一堵墙。地图的高度和宽度可以从 2 到 20。只能在基本方向上移动;不允许对角线移动。
语言
要提供 Python 解决方案,请编辑 solution.py 要提供 Java 解决方案,请编辑 Solution.java
测试用例
您的代码应该通过以下测试用例。 请注意,它也可能 运行 针对此处未显示的隐藏测试用例。
-- Python 个案例 -- 输入: solution.solution([[0, 1, 1, 0], [0, 0, 0, 1], [1, 1, 0, 0], [1, 1, 1, 0]]) 输出: 7
输入: solution.solution([[0, 0, 0, 0, 0, 0], [1, 1, 1, 1, 1, 0], [0, 0, 0, 0, 0, 0], [ 0, 1, 1, 1, 1, 1], [0, 1, 1, 1, 1, 1], [0, 0, 0, 0, 0, 0]]) 输出: 11
-- Java 个案例 -- 输入: Solution.solution({{0, 1, 1, 0}, {0, 0, 0, 1}, {1, 1, 0, 0}, {1, 1, 1, 0}}) 输出: 7
输入: Solution.solution({{0, 0, 0, 0, 0, 0}, {1, 1, 1, 1, 1, 0}, {0, 0, 0, 0, 0, 0}, { 0, 1, 1, 1, 1, 1}, {0, 1, 1, 1, 1, 1}, {0, 0, 0, 0, 0, 0}}) 输出: 11
咳咳,我修好了。我设法使用随机测试用例生成器生成了一堆测试用例,并意识到我访问的数组定义不正确。
我在下面列出了正确的解决方案以供参考。
import java.util.PriorityQueue;
public class Solution
{
public static int ans = Integer.MAX_VALUE;
public static int dx [] = {0,0,-1,1};
public static int dy [] = {-1,1,0,0};
static class State implements Comparable<State>
{
int x,y,moves;
boolean wentThroughWall;
public State(int x, int y, int moves, boolean wentThroughWall)
{
this.x = x;
this.y = y;
this.moves = moves;
this.wentThroughWall = wentThroughWall;
}
public int compareTo(State other)
{
return moves - other.moves;
}
}
public static int solution(int[][] map)
{
PriorityQueue<State> enque = new PriorityQueue<State>();
boolean visited [][][] = new boolean [map.length][map[0].length][2];
enque.add(new State(0, 0, 1,false));
while(!enque.isEmpty())
{
State top = enque.poll();
if(top.x == map.length - 1 && top.y == map[0].length - 1)
{
ans = Math.min(ans, top.moves);
continue;
}
if(visited[top.x][top.y][(top.wentThroughWall ? 0 : 1)])
continue;
visited[top.x][top.y][(top.wentThroughWall ? 0 : 1)] = true;
for(int i = 0; i < dx.length; i++)
{
int nx = top.x + dx[i];
int ny = top.y + dy[i];
if(nx < 0 || nx >= map.length || ny < 0 || ny >= map[0].length || (map[nx][ny] == 1 && top.wentThroughWall))
continue;
if(map[nx][ny] == 1)
enque.add(new State(nx, ny, top.moves + 1, true));
else
enque.add(new State(nx, ny, top.moves + 1, top.wentThroughWall));
}
}
assert(ans != Integer.MAX_VALUE);
return ans;
}
public static void main(String[] args) {
int [][] test = {{0, 0, 0, 0, 0, 0}, {1, 1, 1, 1, 1, 0}, {0, 0, 0, 0, 0, 0}, {0, 1, 1, 1, 1, 1}, {0, 1, 1, 1, 1, 1}, {0, 0, 0, 0, 0, 0}};
System.out.println(Solution.solution(test));
}
}
作为一个有竞争力的人,我想知道我的代码是否真的有效,或者只是弱测试。
如果您发现一个测试用例破坏了我的代码,请在评论中告诉我,我会尽快回复您。