Попытка заставить два слова пересечь друг друга в сетке 2D Array - PullRequest
0 голосов
/ 20 ноября 2011

Мне нужно составить кроссворд, и он должен делать следующие вещи: -Читать ввод из файла .txt, который содержит список слов.Слова размещаются по одному в строке.-Если слова имеют одинаковую букву, то они могут пересекаться, НО-два слова не могут касаться друг друга по вертикали или по горизонтали.то есть собака и туман не могут пересекаться с гагаром, так как они касаются друг друга.Если такой случай имеет место, слово должно быть пропущено, но сохранено для использования в случае более позднего пересечения - начать со слова в центре сетки по горизонтали - распечатать кроссворд

Я не могу получить ничего из этогоработая так, я начинаю пытаться получить более простые шаги, чтобы работать в первую очередь.Я пытаюсь заставить два слова успешно пересечь друг друга.

Файл input1.txt содержит следующие слова (просто пытаюсь это проверить): наклон клоуна (разделен на две строки)

import java.util.*;
import java.io.*;
/**
The class A2 reads a list of words from standard input and 
produces a crossword layout.
*/
public class A2
{
public static void main(String[] args) throws IOException
{

    Scanner in = new Scanner (new File("input1.txt"));
    Crossword board = new Crossword();
    ArrayList<String> str = new ArrayList<>();

    String words = "The words are:";
    System.out.println(words);
    while (in.hasNextLine() == true) //reads all the words in the input1.txt file into an ArrayList of strings
    {
        int i = 0;
        str.add(i, in.nextLine());
        String wurds = "";

        wurds += str.get(i);
        System.out.println(wurds); //prints out the words that are in the .txt file
        i++;
    }
    board.fill(str); //fills the 2d array board with the words
    System.out.print(board.toString()); //converts the 2d array into a string

}
}
/**
The class Crossword knows how to build a crossword layout from
a list of words.
*/
class Crossword
{
private final int ROWS = 20;
private final int COLUMNS = 20;
char[][] crossword;
/**
 Constructs a crossword board with 20 rows and 20 columns, filled with empty spaces.
 */
public Crossword()
{
    crossword = new char[ROWS][COLUMNS];
    for (int i = 0; i < ROWS; i++)
        for (int j = 0; j < COLUMNS; j++)
            crossword[i][j] = ' ';
}
/**
 Finds the largest word in an ArrayList.
 @param from the first position of the tail region
 @param anArray the arrayList which is being searched
 @return largestWord the word with the largest length
 */
private int largestWord(int from, ArrayList<String> anArray)
{
    int largestWord = from;
    for (int i = from + 1; i < anArray.size(); i++)
        if ((anArray.get(i)).length() > (anArray.get(largestWord)).length())
            largestWord = i;
    return largestWord;
}
/**
    Fills the crossword board with words from an ArrayList.
    @param a1 the ArrayList of strings which will fill the board.
 */
public void fill(ArrayList<String> a1)
{
    int i = 0;
    int j;
    int count = 0;
    while (i < a1.size())
    {  
        int maxPos = largestWord(i, a1);
        for (j = 0; j < (a1.get(maxPos)).length(); j++)
        {
            crossword[ROWS/2][j] = (a1.get(maxPos)).charAt(j);  
        }                                                            //everything is OK until this point
        i++;
        while (j < (a1.get(0)).length())                            
        {                                                           
            int x = 0;  
            for (int u = 0; u < (a1.get(i)).length(); u++)          
                if ((a1.get(i)).charAt(x) != crossword[ROWS/2][j]) 
                {
                    count++;                                            //count is being incremented to remember the column position
                    if (crossword[ROWS/2][j] == (a1.get(i)).charAt(x)) 
                    {
                        crossword[(ROWS/2) + u][count] = (a1.get(i)).charAt(u); 
                    }
                    j++;
                }
        }
        i++;
    }
}

/**
     Converts the 2d array into a string.
 */
public String toString()
{
    String r = "";
    for (int i = 0; i < ROWS; i++)
    {
        for (int j = 0; j < COLUMNS; j++)         
            r = r + "|" + crossword[i][j];
        r = r + "|\n";
    }
    return r;

}
}

Объяснение того, о чем я думал, когда писал код: самое большое слово «клоунада» идет в среднем ряду 2-го массива.Затем я увеличиваю список массивов и перехожу к следующему слову.Я смотрю в строку, где слово уже присутствует, и пытаюсь найти совпадение со вторым словом.Здесь я немного обманул, потому что первая буква «i» в «наклоне» - это шестая буква в клоунаде, но, как я уже сказал, я просто хочу проверить это и выяснить, что я делаю неправильно, прежде чем делать дальнейшие шаги.Вся помощь и руководство в правильном направлении очень ценится: D

1 Ответ

0 голосов
/ 20 ноября 2011

Если вы отслеживали начальную координату, направление и длину слова, вам не нужно будет копировать буквы в визуальный кроссворд до самого конца.Вы хотите разбить проблему на такие этапы, как: «Может ли мое слово пересекаться с этим членом списка?», «Каково правильное размещение моего слова против этого слова?», «Будет ли это размещение моего слова противоречить любому издругие слова в этом списке?Каждый из этих вопросов должен соответствовать другому методу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...