我们获得了关于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));
}
}
请帮我设计算法/伪代码(或代码,如果你不介意哈哈)。非常感谢你!
答案 0 :(得分:3)
您需要找到一个边界框。
想象一下:
您有2个垂直标尺和2个水平标尺,矩阵的每一边(向上,向下,向左和向右)。
取左垂直标尺并向右移动,直到找到要查找的字母为止 拿右边的垂直标尺向左移动,直到你找到你要找的字母为止 取上部水平标尺并将其向下移动,直到找到要查找的字母为止 拿下较低的水平标尺并向上移动,直到你找到你想要的字母。
完成后,4个标尺将形成一个最小边界框 剩下的就是你的数组中没有这样的字符的情况(提示:“右”标尺将从“左”标尺中留下)。
这是最基本的方法,可能不是最优的,但可以理解。 :d
答案 1 :(得分:1)
由于这是一项任务,我将为您提供一个基本的想法,您可以在其中提出your own solution
:可以根据其四个角来定义矩形。你可以找到这样的角落。请注意,ch
最左边,最左边,最顶部和最下面的一个会有所帮助,但它们不一定是角落!例如,左上角是(x,y)
,其中x
是最左侧出现ch
的行,而y
将是ch
的列。最重要的一个。
使用四个角的坐标,您可以定义包含矩阵中所有出现的{{1}}的最小矩形。
答案 2 :(得分:0)
有几种方法可以考虑这个问题。
答案 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;
}