2012-07-13 97 views
-3

我們給出關於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

你只需要檢查,看看是否在該位置的字符是你正在尋找......我想你應該搞清楚如何做到這一點看到,因爲這是怎樣的功課不是STACKOVERFLOWwork – EEP 2012-07-13 15:24:33

+3

問題,如整點的角色這是當你第一次開始時挑戰你。坐下來,筆和紙,關閉你的計算機,邏輯上思考你會採取什麼步驟來逐步解決問題的紙張上。然後寫出一些僞代碼。這樣做會使你處於更好的位置。 – 2012-07-13 15:25:52

回答

0

以下是幾種思考問題的方法。

  1. 如何用鉛筆和紙張解決這個問題?分析您在手動解決問題時所經歷的步驟,並考慮如何將其轉化爲邏輯步驟,例如向孩子解釋如何找到矩形。
  2. 本質上,如果您檢查如何「綁定」某些東西,則需要在矩形的最遠端(即角點)查找字符。找到最左邊,最上面,最右邊和最底部的位置,並且定義了一個矩形。
1

既然這是一個任務,我會給你你可能想出的基本想法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

3

您需要找到一個邊界框。

想象一下這樣的:

你有2個垂直和2個水平標尺,一個在矩陣的每個邊(上,下,左,右)。

拿起左側的垂直標尺並向右移動,直到找到您要查找的字母。
採取正確的垂直標尺和向左移動,直到你擊中你正在尋找的信。
取上面的水平標尺並將其向下移動,直到找到您要查找的字母。
拿下水平尺,直到你找到你要找的字母爲止。

完成後,4個統治者將形成一個最小邊界框。
當你的數組中沒有這樣的字符(提示:「右」標尺將從「左」標尺留下)時,所有留給你的情況都是如此。

這是最基本的做法,也許不是最佳的,但還算可以理解的。 :d

0

把你的問題。你需要做什麼?

1)您需要檢測左上角 2)您需要檢測右下角 3)之間的一切都是你的矩形

現在,鳥巢for循環中charArea已經從左上角到右下角的數組中循環。 您必須檢測到特定字符的2-4次出現。根據情況,你需要2個字符來完全定義你的矩形的一個角,或者只是一個。

所以當你有矩形的左上角UND右下角,計算它有多大不應該是一個問題。

0

什麼,我會做的是從參數取炭,並找到了它的第一次出現,並將其存儲在一個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