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 で送信しようとすると、送信に対する間違った回答が返されます。

2 つの質問があります: 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

ここにあなたが見ることができる1つのことがあります。

プログラムがサンプルとまったく同じように見える出力を提供する必要があることがわかっている場合、たとえばあなたの場合

*100
2210
1*10
1110

スペース、タブ、改行などの非表示の空白をチェックする必要があります (これは\r\nまたは\r\nformat である可能性があります)。特に、一般的な落とし穴は次のとおりです。

・最終行の後に改行がありますか?

-改行が\r\nまたはであるかどうかは重要です\r\nか?

-どこかに余分なスペースがある場合、または出力を開始する前に改行がある場合、サンプルは一致しないと見なされますか?

-タブまたは多数のスペースがある場合、スペースの代わりにタブを使用するか、またはその逆を使用すると、サンプルが一致すると見なされなくなりますか?

あなたのコードには潜在的な落とし穴が1 つあります。

行の右端が地雷の場合はprint('*')println('*'). これを解決するには、行の右側にあるセルの内容に関係なく println() を実行します - または println コンテンツを出力するロジックがなく、引数なしで println() だけを実行します。

編集:そして、チャーリーが元の質問へのコメントで言及しているように、複数のフィールドを処理し、各フィールドの前に Field #num: を出力するようにプログラムをコーディングする必要があります。

つまり、すべてのコードをメインに配置する代わりに、1 つのフィールドを作成して解決するコードを独自のメソッドに配置し、読み取る入力がまだある間にメインから呼び出す必要があります。

于 2013-03-18T00:49:59.027 に答える