2维数组

问题描述:

我们给出关于2-d数组赋值的规定:

给定一个矩形2-d char grid [row] [col]char去寻找,找到包含最小矩形字符的所有事件和返回它的区域。如果char只有一次出现,那么将其包围的矩形为1x1,区域为1.如果该字符未出现,则返回0的面积。
下面是问题的链接和示例: http://www.stanford.edu/class/cs108/handouts081/03HW1CodeCamp.pdf(页面2)但我们必须使用int charArea (char[][] grid, char ch)而不是int charArea (char ch)

请帮我想出一个算法。我是Java新手,我很难考虑伪代码/代码。我只知道是2维数组

import java.util.*; 

public class Area { 

    public static int charArea (char[][] grid, char ch) { 
     for (int i=0; i<3; i++) { //row 
      for (int j=0; j<4; j++) { //column 
      // What now, please?       
      } 
     } 
     return answer; 
    } 

    public static void main(String[] args) { 
     char[][] grid = { 
       {'a', 'b', 'c', 'd'}, 
       {'a', ' ', 'c', 'd'}, 
       {'x', 'b', 'c', 'a'} 
     }; 
     Scanner input = new Scanner (System.in); 
     System.out.print("Enter a character to look for: "); 
     String temp = input.nextLine(); 
     char ch = temp.charAt(0); 
     System.out.print(charArea(grid, ch)); 
    } 

} 

只是请帮我设计一个算法/伪码(或代码,如果你不介意哈哈)。非常感谢!

+0

有什么问题呢? “*设计完整的算法*”? – Lion 2012-07-13 15:24:04

+0

你只需要检查,看看是否在该位置的字符是你正在寻找......我想你应该搞清楚如何做到这一点看到,因为这是怎样的功课不是*work – EEP 2012-07-13 15:24:33

+3

问题,如整点的角色这是当你第一次开始时挑战你。坐下来,笔和纸,关闭你的计算机,逻辑上思考你会采取什么步骤来逐步解决问题的纸张上。然后写出一些伪代码。这样做会使你处于更好的位置。 – 2012-07-13 15:25:52

以下是几种思考问题的方法。

  1. 如何用铅笔和纸张解决这个问题?分析您在手动解决问题时所经历的步骤,并考虑如何将其转化为逻辑步骤,例如向孩子解释如何找到矩形。
  2. 本质上,如果您检查如何“绑定”某些东西,则需要在矩形的最远端(即角点)查找字符。找到最左边,最上面,最右边和最底部的位置,并且定义了一个矩形。

既然这是一个任务,我会给你你可能想出的基本想法your own solution:矩形可以在其四个角的功能中定义。你可以找到这样的角落。请注意,ch(最远到最左边,最上面一个和最下面一个)的距离最远的情况会有所帮助,但它们不一定是角点!例如,左上角将是(x,y),其中xch的最左边出现的行,而y将是最高出现的一列。

使用四角的坐标,您可以定义矩阵中包含所有出现的ch的最小矩形。

+0

我会稍微修改一下,因为你说的是​​四角,然后告诉他们去寻找极端的事件。发生的事情本身不会是角落,但他们分享的坐标将是。 – 2012-07-13 15:28:30

+0

矩形完全由两个角定义;)您不需要四个。 – Polygnome 2012-07-13 15:32:33

+0

基于示例文本,矩形需要2个角,而不是4个。 – 2012-07-13 15:48:49

您需要找到一个边界框。

想象一下这样的:

你有2个垂直和2个水平标尺,一个在矩阵的每个边(上,下,左,右)。

拿起左侧的垂直标尺并向右移动,直到找到您要查找的字母。
采取正确的垂直标尺和向左移动,直到你击中你正在寻找的信。
取上面的水平标尺并将其向下移动,直到找到您要查找的字母。
拿下水平尺,直到你找到你要找的字母为止。

完成后,4个统治者将形成一个最小边界框。
当你的数组中没有这样的字符(提示:“右”标尺将从“左”标尺留下)时,所有留给你的情况都是如此。

这是最基本的做法,也许不是最佳的,但还算可以理解的。 :d

把你的问题。你需要做什么?

1)您需要检测左上角 2)您需要检测右下角 3)之间的一切都是你的矩形

现在,鸟巢for循环中charArea已经从左上角到右下角的数组中循环。 您必须检测到特定字符的2-4次出现。根据情况,你需要2个字符来完全定义你的矩形的一个角,或者只是一个。

所以当你有矩形的左上角UND右下角,计算它有多大不应该是一个问题。

的问题是:你如何使用你的代码中的数组。那么,你应该首先寻找变量定义,特别是在类中的变量。您可以开始阅读http://docs.oracle.com/javase/tutorial/java/javaOO/classes.html。这就是所谓的领域,这就是你所使用的为网格声明...

什么,我会做的是从参数取炭,并找到了它的第一次出现,并将其存储在一个2-d阵列ints来保存一组坐标。那么,也许向后工作,并在你的2-d阵列月底开始,找到最后一次出现,因为那样的话,你知道的范围内,他们可以英寸


public static int charArea (char[][] grid, char ch) { 
    int[] first = new int[2]; 
    int[] last = new int[2]; 
    for (int i=0; i<3; i++) { //row 
     for (int j=0; j<4; j++) { //column 
       //checks to see if it is the char we need 
       if(grid[i][j].equals(ch) && (first[0] != null && first[1] != null)){ 
        first[0] = i; 
        first[1] = j; 
       } 
     } 
    } 

    for (int i=3; i>0; i--) { //row 
     for (int j=4; j>4; j--) { //column 
      //checks to see if it is the char we need 
       if(grid[i][j].equals(ch) && (first[0] != null && first[1] != null)){ 
        last[0] = i; 
        last[1] = j; 
       }      
     } 
    } 

    answer = ((Math.max(first[0],last[0]) - Math.min(first[0],last[0])) *(Math.max(first[1],last[1]) - Math.min(fist[1],last[1])); 

    return answer; 
} 
+4

当问题是家庭作业时,您应该**不要**给出答案。 – mellamokb 2012-07-13 15:52:02