2013-03-18 26 views
1

我試圖在弗吉尼亞大學(http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=24&page=show_problem&problem=1130掃雷 - 在線法官 「錯誤的答案」,但它的工作原理上的Netbeans

樣品輸入提交掃雷問題:

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; 
       } 
      } 
     } 
    } 
} 
+0

我們對網上法官的瞭解不多。它是否需要在stdout中輸出,還是期待函數調用? – Makoto 2013-03-18 00:29:05

+0

@Makoto它需要提交一個類Main和它的main()包含要運行的代碼。不再。我在此標準之前提交了一個問題 – 2013-03-18 00:30:55

+0

這不是對您的問題的回答,但是您的用於檢查鄰居的代碼真的非常難看。我建議改爲列舉所有可能的方向,每個方向都有一個'xdelta'和一個'ydelta',這個函數在一個提供的方向上檢查一個鄰居,並枚舉調用該方法的所有可能的方向。 – Patashu 2013-03-18 00:31:32

回答

3

這裏有一兩件事你可以看看。

當你知道你的程序必須給出看起來完全像樣本的輸出時,你的情況

*100 
2210 
1*10 
1110 

您應該檢查隱藏的空白 - 例如空格,製表符,新線(可\r\n\r\n格式)。特別是,常見的陷阱是:

- 最後一行之後是否有換行符?

- 如果你的換行符是\r,\n\r\n

- 如果你有多餘的空格的任何地方,或者在開始輸出之前斷行,它考慮的樣品不一致呢?

- 如果有空格的標籤或批次,並使用製表符而不是空格或反之亦然作出不予考慮,以匹配樣品?

我看到你的代碼一個潛在疑難雜症。

如果一行的右邊是一個地雷,它將會是print('*')而不是println('*')。爲了解決這個問題,不管println()如果它在一行的右邊,不管它在單元格中是什麼 - 沒有邏輯來打印或println內容,只是println()沒有自己的參數。

編輯:正如查理的意見,原來的問題提到了,你必須編寫你的程序來處理多個字段,並打印場#NUM:每個字段之前。

含義,而不是把所有的代碼在主,你應該把創建,並解決一個領域到它自己的方法的代碼,並呼籲從主,同時還有輸入讀取數據。

+0

非常感謝你的建議。這裏的大多數人不尊重初學者的問題,這是非常令人失望的。謝謝 – 2013-03-18 00:53:20

相關問題