我尝试为2020年B轮的Google Kick Start问题写一个简短的解决方案,并始终获得WA。我试图找出哪里出了问题,但没有发现。我什至下载了别人传递的代码,并编写了一个数据集创建器,以使两个程序运行并比较结果,但是运行了100,000组以上的数据后,没有发现任何不同。我现在有点疯了,请您帮我检查一下代码中的错误吗?
这是问题:
Jemma正在参加机器人竞赛。今天的挑战 是要建造一个可以在竞技场上的洞周围导航的机器人。
舞台是包含W列(从1到W的正方形)的正方形网格 从左到右)和H行(从上到下从1到H编号)。 第x列和第y行中的正方形表示为(x,y)。的 机器人从左上角的正方形(1,1)开始,并且必须导航到 右下角的正方形(W,H)。
一个正方形的矩形子网格已从网格中切出。更多 具体来说,位于左上角的矩形中的所有正方形 正方形(L,U)和右下角正方形(R,D)已删除。
Jemma没有太多时间为她的机器人编程,因此遵循 非常简单的算法:如果机器人在最右边的列中 将始终移动到其正下方的广场。否则,如果 机器人位于最底行,它将始终移动到正方形 直接就可以了。否则,机器人会随机选择 直接移至右侧的正方形或正方形 以相等的概率直接位于其下方。
如果她的机器人避免掉进洞里,杰玛就会挑战 并使其成正方形(W,H)。她通过的概率是多少 挑战吗?
输入
输入的第一行给出测试用例的数量T 测试用例如下。每个测试用例包含一行 W,H,L,U,R和D。输出
如果
对于每个测试用例,输出包含Case #x的一行:y, 其中x是测试用例编号(从1开始),y是实数 介于0和1之间的数字,包括Jemma通过的概率 挑战。y在绝对或相对范围内,则将被认为是正确的 错误10-5的正确答案。请参阅常见问题解答以获取有关的解释 这意味着什么,我们接受哪种实数格式。
时限:
每个测试集15秒。内存限制:1GB。 1≤T≤ 100. 1≤U≤D≤H. 1≤L≤R≤W。左上角和右下角都不会丢失。测试仪1 1≤W≤300. 1≤H≤300。
测试仪2 1≤W≤105. 1≤H≤105。
这是我的代码:
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int sets = scan.nextInt();
for(int q = 0; q < sets; q++){
int rows = scan.nextInt();
int cols = scan.nextInt();
double[][] board = new double[rows + 1][cols + 1];
int leftx = scan.nextInt();
int lefty = scan.nextInt();
int rightx = scan.nextInt();
int righty = scan.nextInt();
if((rightx == rows && righty == cols) || (leftx == 1 && rightx == 1)){
System.out.println("Case #" + (q + 1) + ": " + 0.0);
continue;
}
board[1][1] = 1;
for(int i = 1; i < rows; i++){
for(int j = 1; j < cols; j++){
if((i == rightx && j >= lefty && j <= righty) || (j == righty && i >= leftx && i <= rightx)){
continue;
}
board[i + 1][j] += board[i][j] / 2;
board[i][j + 1] += board[i][j] / 2;
}
}
for(int i = 1; i < rows; i++){
if(cols == righty && i >= leftx && i <= rightx){
continue;
}
board[i + 1][cols] += board[i][cols];
}
for(int i = 1; i < cols; i++){
if(rows == rightx && i >= lefty && i <= righty){
continue;
}
board[rows][i + 1] += board[rows][i];
}
System.out.printf("Case #%d: %.10f\n", q + 1, board[rows][cols]);
}
}
}
谢谢!
答案 0 :(得分:0)
问题要求找到概率, y是介于0和1之间(含0和1)的实数。您的代码计算安全地通往右下角的路径数(整数)。难怪这是一个错误的答案。