Просьба подбросить такой тест который мой код не пройдет, просто уже на понимаю почему не принимает решения.
Специально сделал если слово повторяется то его второй раз не выводит, если убрать эту проверку то все равно не помогает.
package com.javarush.task.task20.task2027;
import java.util.ArrayList;
import java.util.List;
/*
Кроссворд
1. Дан двумерный массив, который содержит буквы английского алфавита в нижнем регистре.
2. Метод detectAllWords должен найти все слова из words в массиве crossword.
3. Элемент(startX, startY) должен соответствовать первой букве слова, элемент(endX, endY) - последней.
text - это само слово, располагается между начальным и конечным элементами
4. Все слова есть в массиве.
5. Слова могут быть расположены горизонтально, вертикально и по диагонали как в нормальном, так и в обратном порядке.
6. Метод main не участвует в тестировании.
Требования:
1. В классе Solution должен существовать метод detectAllWords.
2. В классе Solution должен существовать статический класс Word.
3. Класс Solution не должен содержать статические поля.
4. Метод detectAllWords должен быть статическим.
5. Метод detectAllWords должен быть публичным.
6. Метод detectAllWords должен возвращать список всех слов в кроссворде (согласно условию задачи).
*/
public class Solution {
public static void main(String[] args) {
int[][] crossword = new int[][]{
{'f', 'd', 'e', 'w', 'l', 'k'},
{'u', 's', 'a', 'm', 'e', 'o'},
{'l', 'n', 'g', 'r', 'o', 'v'},
{'m', 'a', 'p', 'r', 'r', 'h'},
{'s', 'o', 'e', 'e', 'j', 'j'}
};
detectAllWords(crossword, "home", "same", "saw", "ho", "a", "fdewlk", "fsgrj");
/*
Ожидаемый результат
home - (5, 3) - (2, 0)
same - (1, 1) - (4, 1)
*/
}
public static List<Word> detectAllWords(int[][] crossword, String... words) {
List<Word> list = new ArrayList<>();
List<String> list2 = new ArrayList<>();
for (String string :words) {
String firstLetter = string.substring(0,1);
String lastLetter = string.substring(string.length()-1);
/* System.out.println(firstLetter + "!!!!!!!!!!!!!!!!");
System.out.println(lastLetter);*/
int staretPoiti = 0;
int staretPoitj = 0;
int endPointi = 0;
int endPointj = 0;
for (int i = 0; i < 5; i++) {
for (int y = 0; y < 6; y++) {
String letter = String.valueOf((char) crossword[i][y]);
if (firstLetter.equals(letter)) {
staretPoiti = i;
staretPoitj = y;
if (string.length() > 1) {
for (int q = 0; q < 5; q++) {
for (int w = 0; w < 6; w++) {
String letterEnd = String.valueOf((char) crossword[q][w]);
String finaleWord = "";
if (lastLetter.equals(letterEnd)) {
endPointi = q;
endPointj = w;
/*System.out.println(letter + " " + staretPoiti + " : " + staretPoitj + " - " + letterEnd + " " + endPointi + " : " + endPointj);*/
boolean forWhile = true;
finaleWord += letter;
int staretPoiti1 = staretPoiti;
int staretPoitj1 = staretPoitj;
int endPointi1 = endPointi;
int endPointj1 = endPointj;
while (true) {
int firstIndex = staretPoiti1;
int secondIndex = staretPoitj1;
forWhile = false;
if (staretPoiti1 > endPointi1) {
firstIndex = --staretPoiti1;
forWhile = true;
if (staretPoiti1 == endPointi1) {
forWhile = false;
}
} else if (endPointi1 > staretPoiti1) {
firstIndex = ++staretPoiti1;
forWhile = true;
if (staretPoiti1 == endPointi1) {
forWhile = false;
}
}
if (staretPoitj1 > endPointj1) {
secondIndex = --staretPoitj1;
forWhile = true;
if (staretPoitj1 == endPointj1) {
forWhile = false;
}
} else if (endPointj1 > staretPoitj1) {
secondIndex = ++staretPoitj1;
forWhile = true;
if (staretPoitj1 == endPointj1) {
forWhile = false;
}
}
if (!forWhile) {
break;
}
/* System.out.println(firstIndex + " : " + secondIndex + " - " + String.valueOf((char) crossword[firstIndex][secondIndex]));*/
finaleWord += String.valueOf((char) crossword[firstIndex][secondIndex]);
}
finaleWord += letterEnd;
/* System.out.println(finaleWord);*/
if (string.equals(finaleWord)) {
if (!list2.contains(finaleWord)) {
list2.add(finaleWord);
/* System.out.println(finaleWord);*/
Word word = new Word(finaleWord);
word.setEndPoint(endPointj, endPointi);
word.setStartPoint(staretPoitj, staretPoiti);
list.add(word);
}
}
}
}
}
}
else {
if (!list2.contains(letter)) {
list2.add(letter);
Word word = new Word(letter);
word.setEndPoint(staretPoitj, staretPoiti);
word.setStartPoint(staretPoitj, staretPoiti);
list.add(word);
}
}
}
}
}
}
for (Word word :list) {
System.out.println(word);
}
return list;
}
public static class Word {
private String text;
private int startX;
private int startY;
private int endX;
private int endY;
public Word(String text) {
this.text = text;
}
public void setStartPoint(int i, int j) {
startX = i;
startY = j;
}
public void setEndPoint(int i, int j) {
endX = i;
endY = j;
}
@Override
public String toString() {
return String.format("%s - (%d, %d) - (%d, %d)", text, startX, startY, endX, endY);
}
}
}