1

我试图提交关于 UVa 的扫雷问题(http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=24&page=show_problem&problem=1130

样本输入:

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;
                }
            }
        }
    }
}
4

1 回答 1

3

这是您可以查看的一件事。

当您知道您的程序必须提供看起来完全像样本的输出时,例如在您的情况下

*100
2210
1*10
1110

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

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

-你的换行符是\r还是\n有关系\r\n吗?

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

- 如果有制表符或大量空格,是否使用制表符代替空格或反之亦然会使样本不被视为匹配?

我在您的代码中看到了一个潜在的问题。

如果一行的右边缘是地雷,它将print('*')而不是println('*'). 为了解决这个问题,不管单元格中的内容是否位于一行的右侧,都执行 println() - 没有打印 OR println 内容的逻辑,只需 println() 本身没有参数。

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

这意味着不要将所有代码放在 main 中,而应该将创建和解决一个字段的代码放入它自己的方法中,并在仍有要读取的输入时从 main 调用它。

于 2013-03-18T00:49:59.027 回答