示例输入:
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 :(得分:3)
这是你可以看到的一件事。
当您知道您的程序必须提供与样本完全相同的输出时,例如在你的情况下
*100
2210
1*10
1110
您应该检查隐藏的空格 - 例如空格,制表符,新行(可以是\r
,\n
或\r\n
格式)。特别是,常见的问题是:
- 在最后一行之后是否有换行符?
- 您的换行符是\r
,\n
还是\r\n
是否重要?
- 如果您在任何地方有额外的空格,或者在开始输出之前有换行符,那么它是否认为样本与之不匹配?
- 如果有标签或大量空格,是否使用制表符而不是空格,反之亦然使得样本不被认为匹配?
我在您的代码中看到了一个潜在陷阱。
如果行的右边缘是我的,它将print('*')
而不是println('*')
。为了解决这个问题,println()无论单元格中的内容是否在行的右侧 - 没有逻辑来打印OR println内容,只有println()本身没有参数。
编辑:正如查理在对原始问题的评论中提到的那样,你必须编写程序以处理多个字段并在每个字段之前打印字段#num:
意思不是将所有代码放在main中,而是应该将创建并解析一个字段的代码放入其自己的方法中,并在仍有输入要读取时从main调用。