二维阵列

时间:2012-07-13 15:21:03

标签: java arrays multidimensional-array

我们获得了关于2-D阵列的任务,其中规定:

给定要查找的矩形2-d char grid [row] [col] char ,找到包含该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新手,我很难想到伪代码/代码。我所知道的只是

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));
    }

}

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

6 个答案:

答案 0 :(得分:3)

您需要找到一个边界框。

想象一下:

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

取左垂直标尺并向右移动,直到找到要查找的字母为止 拿右边的垂直标尺向左移动,直到你找到你要找的字母为止 取上部水平标尺并将其向下移动,直到找到要查找的字母为止 拿下较低的水平标尺并向上移动,直到你找到你想要的字母。

完成后,4个标尺将形成一个最小边界框 剩下的就是你的数组中没有这样的字符的情况(提示:“右”标尺将从“左”标尺中留下)。

这是最基本的方法,可能不是最优的,但可以理解。 :d

答案 1 :(得分:1)

由于这是一项任务,我将为您提供一个基本的想法,您可以在其中提出your own solution:可以根据其四个角来定义矩形。你可以找到这样的角落。请注意,ch最左边,最左边,最顶部和最下面的一个会有所帮助,但它们不一定是角落!例如,左上角是(x,y),其中x是最左侧出现ch的行,而y将是ch的列。最重要的一个。

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

答案 2 :(得分:0)

有几种方法可以考虑这个问题。

  1. 你怎么用铅笔和纸来解决这个问题?分析您在手动解决问题时所经历的步骤,并思考如何将其转化为逻辑步骤,比如向孩子解释如何找到矩形。
  2. 基本上,如果你检查一下你如何“束缚”某些东西,你需要在矩形的最极端(即角落)处寻找角色。找到最左侧,最上方,最右侧和最下方的位置,并定义了一个矩形。

答案 3 :(得分:0)

分开你的问题。你需要做什么?

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

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

因此,如果你有矩形的左上角和右下角,那么计算它的大小应该不是问题。

答案 4 :(得分:0)

问题是:如何使用代码中的数组。那么,您应该首先查找变量定义,特别是对于类中的变量。您可以开始阅读http://docs.oracle.com/javase/tutorial/java/javaOO/classes.html。它被称为Field,这就是你用于网格声明的内容......

答案 5 :(得分:0)

我要做的是从参数中获取char并找到它的第一个匹配项,并将其存储在一个二维的int数组中以保存一组坐标。然后可能向后工作并从你的二维数组的末尾开始并找到最后一次出现,因为那样你就知道了它们的范围。


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