2012-04-18 49 views
1

我有点新来编程,需要帮助做一个递归方法。我有一个方法,在二维数组中选择一个随机空间,然后我想检查空间是否空闲。如果空间是自由,我想使用的空间,但如果不是我想选择一个新的随机空间在2D array.Thanks在Java中需要递归方法的帮助

import java.io.* ; 
import java.util.ArrayList ; 
public class WordSearchPuzzle 
{ 
    private char[][] puzzle ; 
    private ArrayList<String> puzzleWords ; 
    private int letterCount = 0 ; 
    private int gridDimensions; 

    public WordSearchPuzzle(ArrayList<String> userSpecifiedWords) 
    { 
     this.puzzleWords = userSpecifiedWords ; 

    } 

    private void createPuzzleGrid() 
    { 
     int i, itemLength; 
     String item; 
     for (i = 0; i < puzzleWords.size(); i++) { 
      item = puzzleWords.get(i); 
      itemLength = item.length(); 
      letterCount = letterCount + itemLength; 
     } 
     gridDimensions = letterCount * 2; 
     puzzle = new char[gridDimensions][gridDimensions] ; 
    } 

    private void generateWordSearchPuzzle() 
    { 

    } 


    public void firstSpace(String Word) 
     { 
      int row, column; 
      row = (int)(Math.random() * gridDimensions +1); 
      column = (int)(Math.random() * gridDimensions +1); 
      if(puzzle[row][column] != ' '){ 
       firstSpace(); 
      } 
     } 
+0

你有什么问题? – Jim 2012-04-18 10:51:23

+0

这在递归性是一个好的或甚至接近体面的解决方案中不会有问题。只需做一个while-loop选择一个随机空间并检查它是否空闲。 – Mads 2012-04-18 10:51:43

+0

什么是问题,你的退出条件是什么?你有没有界定你的界限? – Phani 2012-04-18 10:52:44

回答

0

我不认为在您的索引计算中加1是必要的,也可能会导致数组越界异常。尽管这取决于您对gridDimensions的定义。

您在注释中指定的问题是因为Java编译器试图找到名为'void firstSpace()'的方法,这是'void firstSpace(String word)'的一种不同方法。

public void firstSpace(String word) 
{ 
    int row, column; 

    // No need to add 1, Java arrays are accessed with the first index 
    // being 0. Math.random() returns from 0 up to but not including 1.0. 
    // e.g. array size = 50, min index = 0, max index = 49 
    // Lets say you get very close to 1 e.g. 0.9999, then 
    // 0.9999 * 50 = 49.995 (after integer truncating you have 49) 
    row = (int)(Math.random() * gridDimensions); 
    column = (int)(Math.random() * gridDimensions); 

    if(puzzle[row][column] != ' ') { 
     // If this element is not "empty" then run the method again 
     // using recursion. null might be a better choice to compare 
     // to depending on how you initialized the array. 
     firstSpace(word); 
    } else { 
     // Otherwise we're finished and we can set the array element 
     // to the new word. 

     // (Assumed post condition (you might want to do something else once you 
     // find a blank index)) 
     puzzle[row][column] = word; 
    } 
} 
+0

感谢Simon帮助我编辑代码以显示目前为止的完整代码 – user1323808 2012-04-18 11:12:16

+0

好的,无需将+1添加到您的行和列计算中。我编辑了代码,并解释了为什么在评论中,希望这是可以理解的。 您发布的新代码与我的预期有很大不同。我认为这是一个'n x n'字符串数组,你有一个'n x n'字符数组,它本质上是一个'n x 1'字符串数组。 – 2012-04-18 11:20:26

+0

非常感谢上百万帮助,只有最后一个问题,当递归部分中的空间不清晰时,系统会提示我输入一个新单词,并且我不确定为什么您将这部分代码放在其他部分拼图中[row] [column] = word;因为它们是不兼容的类型 – user1323808 2012-04-18 11:26:48

2

您在评论中提到的具体问题,是因为firstSpace方法需要有一个字符串作为参数。您应该使用:

firstSpace(word); 

另外要注意,这种方法目前并不返回任何东西,所以你无法知道它选择哪个空间的方式。

+0

感谢吉姆我只是有两个问题1)会提示我每次进入递归函数时都会输入一个新单词,并且2)我可以做一个} else {return row && column; ?? – user1323808 2012-04-18 11:06:52

+0

@ user1323808不,它只会使用传递给第一个递归函数调用的相同单词。要返回两个项目,你必须创建一个包含它们的对象,但是你是对的,你可以在else中返回它们(你也可以在first的第一部分使用return firstSpace(word);)。 – Jim 2012-04-18 11:23:38