扫雷 - 在线评判“错误答案”虽然它适用于Netbeans

时间:2013-03-18 00:26:09

标签: java

我试图在UVa(http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=24&page=show_problem&problem=1130

上提交Minesweeper问题

示例输入:

4 4
*...
....
.*..
....

示例输出:

*100
2210
1*10
1110

我在NetBeans上开发了代码。我已经对它进行了测试并且工作正常,但是当我尝试在UVa上提交它时,它会导致错误的答案。

我有两个问题: 1)我的代码有什么问题? 2)在编码UVa时我应该使用什么以及不应该使用什么?

- 如果我应该遵循不同的标准,请提供建议

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {

    public static void main(String[] args) throws IOException{
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        String line = reader.readLine();
        String REGEX_WHITESPACE = "\\s+";
        String cleanLine = line.trim().replaceAll(REGEX_WHITESPACE, " ");
        String[] numChar = cleanLine.split(REGEX_WHITESPACE);
        int n = new Integer(numChar[0]).intValue();
        int m = new Integer(numChar[1]).intValue();
        char[][] mine = new char[n][m];
        char[] curLine;

        for(int i=0;i<n;i++){
                line=reader.readLine();
                cleanLine = line.trim().replaceAll(REGEX_WHITESPACE, " ");
                curLine = cleanLine.toCharArray();
                if(curLine.length==m){
                    mine[i]=curLine;
                }
        }
        int starsCount=0;
        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++){
                if(mine[i][j]=='*'){
                    System.out.print('*');
                }
                else{
                    try {
                        if (mine[i][j - 1] == '*') {
                            starsCount++;
                        }
                    } catch (Exception e) {
                    }
                    try {
                        if (mine[i][j + 1] == '*') {
                            starsCount++;
                        }
                    } catch (Exception e) {
                    }
                    try {
                        if (mine[i-1][j] == '*') {
                            starsCount++;
                        }
                    } catch (Exception e) {
                    }
                    try {
                        if (mine[i+1][j] == '*') {
                            starsCount++;
                        }
                    } catch (Exception e) {
                    }
                    try {
                        if (mine[i-1][j - 1] == '*') {
                            starsCount++;
                        }
                    } catch (Exception e) {
                    }
                    try {
                        if (mine[i-1][j + 1] == '*') {
                            starsCount++;
                        }
                    } catch (Exception e) {
                    }
                    try {
                        if (mine[i+1][j - 1] == '*') {
                            starsCount++;
                        }
                    } catch (Exception e) {
                    }
                    try {
                        if (mine[i+1][j + 1] == '*') {
                            starsCount++;
                        }
                    } catch (Exception e) {
                    }
                    if(j==m-1){
                        System.out.println(starsCount);
                    }
                    else{
                        System.out.print(starsCount);
                    }
                    starsCount=0;
                }
            }
        }
    }
}

1 个答案:

答案 0 :(得分:3)

这是你可以看到的一件事。

当您知道您的程序必须提供与样本完全相同的输出时,例如在你的情况下

*100
2210
1*10
1110

您应该检查隐藏的空格 - 例如空格,制表符,新行(可以是\r\n\r\n格式)。特别是,常见的问题是:

- 在最后一行之后是否有换行符?

- 您的换行符是\r\n还是\r\n是否重要?

- 如果您在任何地方有额外的空格,或者在开始输出之前有换行符,那么它是否认为样本与之不匹配?

- 如果有标签或大量空格,是否使用制表符而不是空格,反之亦然使得样本不被认为匹配?

我在您的代码中看到了一个潜在陷阱。

如果行的右边缘是我的,它将print('*')而不是println('*')。为了解决这个问题,println()无论单元格中的内容是否在行的右侧 - 没有逻辑来打印OR println内容,只有println()本身没有参数。

编辑:正如查理在对原始问题的评论中提到的那样,你必须编写程序以处理多个字段并在每个字段之前打印字段#num:

意思不是将所有代码放在main中,而是应该将创建并解析一个字段的代码放入其自己的方法中,并在仍有输入要读取时从main调用。