这个java代码有什么问题?

时间:2013-01-12 11:45:49

标签: java

我正在审问ICPC问题HERE

问题归结为找到最大值。这可以通过具有*和的矩阵中的K运算来实现。这样我们就可以在一次操作中连续切换元素。我首先切换导致正数或零的行(切换行2次给0改变)按降序顺序改变*。最后,如果剩下1个切换,则在具有负变化的行中切换具有最小绝对值的行。

这是我的代码 - BELOW CODE IN IDEONE.COM WITH SOME TEST CASES

import java.util.Scanner;


public class Main {

  public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    int t = sc.nextInt();
    for (t = t; t > 0; t--) { 
      int n = sc.nextInt();
      int m = sc.nextInt();
      int k = sc.nextInt();
      char[][] array = new char[n][m] ;
      int[] tracker = new int[n];
      int[] trackerl = new int[n];
      int i,j;
      for (i = 0; i < n; i++) {
        String temp = sc.next();
        for (j = 0; j < m; j++) {             
          array[i][j] = (temp.charAt(j));  
        }   
      }
      int light = 0, diamond = 0;

      for (i = 0; i < n; i++) {
        for (j = 0; j < m; j++) {
          if (array[i][j] == '*') {
            diamond++;
          }     
        }
        tracker[i] = diamond;
        diamond = 0;
      }


      int a, b;
      int temp;
      int sortTheNumbers = n;

      for (a = 1; a < sortTheNumbers; a++) {
        for (b = 0; b < sortTheNumbers-a; b++) {
          if (tracker[b] > tracker[b + 1]) {
            temp = tracker[b];
            tracker[b] = tracker[b + 1];
            tracker[b + 1] = temp;
          }
        }
      }

      for (i = 0; i < n; i++)
        trackerl[i]=m-tracker[i];

      int br = 0;
      try {
        if (m % 2 == 0) {
          for ( i = 0; i <= n - 1; i++)
            if (tracker[i] > (m) / 2)
              br++;  
        }
        if (m % 2 !=0 ) {
          for (i = 0; i <= n - 1; i++)
            if (tracker[i] >= (m + 1) / 2)
              br++;
        }
      } catch (Exception e) {
      }

      int ans = 0;
      try {
        if (br >= k) {
          for (i = n - 1; i > (n - 1 - k); i--)
            ans += tracker[i];

          for (i = (n - 1 - k); i >= 0; i--)
            ans += trackerl[i];       
        }

        if (br < k) {
          if (br != 0 && br != n) {
            for (i = n - 1; i > (n - br); i--) {
              ans += tracker[i];
              k--;
            }

            int pass1 = 0, pass2 = 0;
            if (k % 2 == 0)
              pass1 = Math.max(tracker[(n - br)] + tracker[(n - br - 1)],
                                        trackerl[(n - br)] + trackerl[(n - br - 1)]);
              if (k % 2 != 0)
                pass2 = Math.max(tracker[(n - br)] + trackerl[(n - br - 1)],
                                          trackerl[(n - br)] + tracker[(n - br - 1)]);
                // System.out.print("Hp" + tracker[(n - br)]);
              }

              ans += Math.max(pass1, pass2);
              for (i = (n - 2 - br); i >= 0; i--)
                ans += trackerl[i];
              }
              if (br != 0 && br == n) {
                for (i = n - 1; i > (n - br); i--) {
                  ans += tracker[i];
                  k--;
                }
                if (k % 2 != 0) {
                  ans += tracker[(n - br)];
                }
                if (k % 2 == 0) {
                  ans += trackerl[(n - br)];
                }
                for (i = (n - 1 - br); i >= 0; i--) {
                  ans += trackerl[i];
                }        
              }
              if (br == 0) {
                if (k % 2 != 0) {
                  ans += tracker[(n - 1)];
                }
                if (k % 2 == 0) {
                  ans += trackerl[(n - 1)];
                }
                for (i = (n - 2); i >= 0; i--) {
                  ans += trackerl[i];
                }
              }
            }
          } catch (Exception e) {
          }
          System.out.println(""+ans);
        }
      }
    }

无论我选择哪个测试用例都会给出正确的答案。我在测试用例中保持了多样性,正如你可以从链接中看到的那样。代码不正确,因为法官不接受。我真的找不到缺陷在哪里。它是我的代码还是我的逻辑?请指出我。

1 个答案:

答案 0 :(得分:2)

编写代码与编写论文相同,有语法,拼写,标点符号和其他规则,使代码可读,重点明确。研究这些编写清晰的代码可以获得回报,不仅适用于需要阅读代码的其他人,也适用于您(您将看到更多自己的错误)。

我只想指出格式化代码时遇到的一些项目。 (例子来自内存,而不是你的代码)

if(x=3;y>(2-2-x);y++) 

不要写这样的行,因为

  1. 如果不是一个函数,并选择“if(”over“if(”使它看起来更像一个函数。同样关键字同时

  2. 将多个算术运算字符串(尤其是'+'和' - ')放在一个长行中(如“(2-2-x)”)会混淆' - '字符可以播放的双重角色你最好放入空格“(2 - 2 - x)”,让读者意识到我们正在处理多次减法,没有一元否定操作(负数)。

  3. 如果语句需要三个参数(以分号分隔)。在每个参数之后放入空格可以向读者发出信号,表明它们处于“下一个”参数中。支持“if(x = 3; y&gt;(2-2-x); y ++)”over“if(x = 3; y&gt;(2-2-x); y ++)”。

  4. 在接下来的例子中

    if(x=3;y>(2-2-x);y++) 
      {x=3;y=2;}
    

    以下行中的括号会产生阅读理解问题。

    1. 它们会遇到与if语句后没有括号相同的格式问题。通过将整个块放在一条线上,您会混淆块和线,并且任何线重新排序都会显着影响程序的运行。这是不好的。要解决此问题,请支持“if(x = 3; y&gt;(2 - 2 - x); y ++){”。

    2. 在一行上有一个复合语句,它模仿上面if语句的格式,这可能会让读者误以为这是后续嵌套if语句的一部分。将两个赋值语句放在各自的行上更具可读性。

    3. 将块的结尾绑定到语句,该语句将块边界耦合到特定操作。通常需要更新他们的代码,并且在程序的生命周期内应该连接块的语句和结尾的可能性很小。倾向于将块分隔符的结尾放在非语句行上。

    4. 以上所有要点在一起使用时会产生类似于

      的代码
      if (x = 3; y > (2 - 2 - x); y++) {
        x = 2;
        y = 3;
      }
      

      经过一些简单的格式化后,很明显你有多个块“如果这个,那么”。很明显,很多这些块都遵循一种模式,“如果这样,那么。如果不是这样,那么”。该语言具有处理此类模式的内置功能,并在前面的if块中附加了“else”块。

      (直接来自您的代码)

              if (k % 2 != 0) {
                ans += tracker[(n - 1)]
              }
              if (k % 2 == 0) {
                ans += trackerl[(n - 1)];
              }
      

      可以更清晰地写出来

              if (k % 2 != 0) {
                ans += tracker[(n - 1)]
              } else {
                ans += trackerl[(n - 1)];
              }
      

      或者,使用重新排序来强调不平等的平等

              if (k % 2 == 0) {
                ans += tracker1[(n - 1)]
              } else {
                ans += tracker[(n - 1)];
              }
      

      可以继续,但是在你做了这些更改之后,你的代码真的开始在一个更好的地方,所以谈论更高级别的技术使你的代码可读,直到一些基础知识是没有意义的完成。即便如此,我还是建议您为变量名使用完整的单词,以试图描述变量的用途。

      祝你好运,在我的重新格式化中,我可能已经剪切了一个关闭块分隔符(它们不匹配)或者可能它首先不存在(不像可以检查未格式化的版本)。