Мне нужно составить кроссворд, и он должен делать следующие вещи: -Читать ввод из файла .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