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));
}
}
只是请帮我设计一个算法/伪码(或代码,如果你不介意哈哈)。非常感谢!
以下是几种思考问题的方法。
- 如何用铅笔和纸张解决这个问题?分析您在手动解决问题时所经历的步骤,并考虑如何将其转化为逻辑步骤,例如向孩子解释如何找到矩形。
- 本质上,如果您检查如何“绑定”某些东西,则需要在矩形的最远端(即角点)查找字符。找到最左边,最上面,最右边和最底部的位置,并且定义了一个矩形。
既然这是一个任务,我会给你你可能想出的基本想法your own solution
:矩形可以在其四个角的功能中定义。你可以找到这样的角落。请注意,ch
(最远到最左边,最上面一个和最下面一个)的距离最远的情况会有所帮助,但它们不一定是角点!例如,左上角将是(x,y)
,其中x
是ch
的最左边出现的行,而y
将是最高出现的一列。
使用四角的坐标,您可以定义矩阵中包含所有出现的ch
的最小矩形。
我会稍微修改一下,因为你说的是四角,然后告诉他们去寻找极端的事件。发生的事情本身不会是角落,但他们分享的坐标将是。 – 2012-07-13 15:28:30
矩形完全由两个角定义;)您不需要四个。 – Polygnome 2012-07-13 15:32:33
基于示例文本,矩形需要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;
}
当问题是家庭作业时,您应该**不要**给出答案。 – mellamokb 2012-07-13 15:52:02
有什么问题呢? “*设计完整的算法*”? – Lion 2012-07-13 15:24:04
你只需要检查,看看是否在该位置的字符是你正在寻找......我想你应该搞清楚如何做到这一点看到,因为这是怎样的功课不是*work – EEP 2012-07-13 15:24:33
问题,如整点的角色这是当你第一次开始时挑战你。坐下来,笔和纸,关闭你的计算机,逻辑上思考你会采取什么步骤来逐步解决问题的纸张上。然后写出一些伪代码。这样做会使你处于更好的位置。 – 2012-07-13 15:25:52