漫游机器人-在Kickstart上获得了WA

时间:2020-08-27 03:47:30

标签: java algorithm

我尝试为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]);
        }
    }
}

谢谢!

1 个答案:

答案 0 :(得分:0)

问题要求找到概率, y是介于0和1之间(含0和1)的实数。您的代码计算安全地通往右下角的路径数(整数)。难怪这是一个错误的答案。