Метод detectAllWords должен возвращать список всех слов в кроссворде (согласно условию задачи).
Размер списка возвращаемого методом detectAllWords отличается от правильного!
вот что выдает валидатор.
Прогнал по всем тестам какие нашел в обсуждениях, код все их проходит...
Помогите найти ошибку
package com.javarush.task.task20.task2027;
import java.util.ArrayList;
import java.util.List;
/*
Кроссворд
*/
public class Solution {
public static void main(String[] args) {
// int[][] crossword = new int[][] {
// {'a', 'a', 'a'},
// {'a', 'o', 'a'},
// {'a', 'a', 'a'}
// };
// detectAllWords(crossword, "aaa").forEach(System.out::println);
//// Ожидаемый результат:
//// aaa - (0, 0) - (2, 0)
//// aaa - (0, 0) - (0, 2)
//// aaa - (2, 0) - (0, 0)
//// aaa - (2, 0) - (2, 2)
//// aaa - (0, 2) - (2, 2)
//// aaa - (0, 2) - (0, 0)
//// aaa - (2, 2) - (0, 2)
//// aaa - (2, 2) - (2, 0)
// int[][] crossword = new int[][] {
// {' ', 'd', 'l', 'r', 'o', 'w'},
// {' ', 'r', ' ', ' ', 'r', ' '},
// {' ', 'o', 'd', ' ', 'd', 'd'},
// {'d', 'w', 'o', 'r', 'd', 'r'},
// {'r', 'o', ' ', ' ', 'o', 'o'},
// {'o', 'r', ' ', ' ', ' ', 'w'},
// {'w', 'd', 'r', 'o', 'o', 'w'}
// };
// detectAllWords(crossword, "world", "word").forEach(System.out::println);
// Ожидаемый результат:
// world - (5, 0) - (1, 0)
// word - (1, 3) - (4, 3)
// word - (1, 3) - (1, 0)
// word - (1, 3) - (1, 6)
// word - (5, 5) - (5, 2)
// word - (5, 5) - (2, 2)
// word - (0, 6) - (0, 3)
int[][] crossword = new int[][]{
{'f', 'd', 'e', 'r', 'l', 'k'},
{'u', 's', 'a', 'm', 'e', 'o'},
{'o', 'h', 'g', 'r', 'o', 'v'},
{'m', 'l', 'p', 'r', 'r', 'h'},
{'e', 'o', 'e', 'e', 'j', 'j'}
};
detectAllWords(crossword, "fderlk", "kovhj", "jjeeoe", "emouf", "fsgrj", "kerpo","elgml", "jrrad")
.forEach(System.out ::println);
// fderlk - (0, 0) - (5, 0)
// kovhj - (5, 0) - (5, 4)
// jjeeoe - (5, 4) - (0, 4)
// emouf - (0, 4) - (0, 0)
// fsgrj - (0, 0) - (4, 4)
// kerpo - (5, 0) - (1, 4)
// elgml - (0, 4) - (4, 0)
// jrrad - (5, 4) - (1, 0)
}
public static List<Word> detectAllWords(int[][] crossword, String... words) {
ArrayList<Word> wordList = new ArrayList<>();
for (String word : words) {
Word word1 = new Word(word);
search1:
for (int x = 0; x < crossword.length; x++) {
for (int y = 0; y < crossword[0].length; y++) {
if (crossword[x][y] == word.charAt(0)) {
word1.setStartPoint(x, y);
if (detectRightWord(crossword, word1) != null) {
wordList.add(detectRightWord(crossword, word1));
}
if (detectLeftWord(crossword, word1) != null) {
wordList.add(detectLeftWord(crossword, word1));
}
if (detectDownWord(crossword, word1) != null) {
wordList.add(detectDownWord(crossword, word1));
}
if (detectUpWord(crossword, word1) != null) {
wordList.add(detectUpWord(crossword, word1));
}
if (detectRightDownWord(crossword, word1) != null) {
wordList.add(detectRightDownWord(crossword, word1));
}
if (detectLeftDownWord(crossword, word1) != null) {
wordList.add(detectLeftDownWord(crossword, word1));
}
if (detectRightUpWord(crossword, word1) != null) {
wordList.add(detectRightUpWord(crossword, word1));
}
if (detectLeftUpWord(crossword, word1) != null) {
wordList.add(detectLeftUpWord(crossword, word1));
}
}
}
}
}
return wordList;
}
private static Word detectRightWord(int[][] crossword, Word word) {
Word word1 = new Word(word.text);
word1.setStartPoint(word.startX, word.startY);
if ((crossword[0].length - word1.startY) < word1.text.length())
return null;
else {
for (int i = 0; i < word1.text.length(); i++) {
if (crossword[word1.startX][word1.startY + i] != word1.text.charAt(i)) {
break;
} else {
word1.setEndPoint(word1.startX, word1.startY + i);
if (i == word1.text.length() - 1){
word1.setStartPoint(word1.startY, word1.startX);
word1.setEndPoint(word1.endY, word1.endX);
return word1;
}
}
}
}
return null;
}
private static Word detectLeftWord(int[][] crossword, Word word) {
Word word1 = new Word(word.text);
word1.setStartPoint(word.startX, word.startY);
if ((word1.startY + 1) < word1.text.length())
return null;
else {
for (int i = 0; i < word1.text.length(); i++) {
if (crossword[word1.startX][word1.startY - i] != word1.text.charAt(i)) {
break;
} else {
word1.setEndPoint(word1.startX, word1.startY - i);
if (i == word1.text.length() - 1){
word1.setStartPoint(word1.startY, word1.startX);
word1.setEndPoint(word1.endY, word1.endX);
return word1;
}
}
}
}
return null;
}
private static Word detectDownWord(int[][] crossword, Word word) {
Word word1 = new Word(word.text);
word1.setStartPoint(word.startX, word.startY);
if ((crossword.length - word1.startX) < word1.text.length())
return null;
else {
for (int i = 0; i < word1.text.length(); i++) {
if (crossword[word1.startX + i][word1.startY] != word1.text.charAt(i)) {
break;
} else {
word1.setEndPoint(word1.startX + i, word1.startY);
if (i == word1.text.length() - 1){
word1.setStartPoint(word1.startY, word1.startX);
word1.setEndPoint(word1.endY, word1.endX);
return word1;
}
}
}
}
return null;
}
private static Word detectUpWord(int[][] crossword, Word word) {
Word word1 = new Word(word.text);
word1.setStartPoint(word.startX, word.startY);
if ((word1.startX + 1) < word1.text.length())
return null;
else {
for (int i = 0; i < word1.text.length(); i++) {
if (crossword[word1.startX - i][word1.startY] != word1.text.charAt(i)) {
break;
} else {
word1.setEndPoint(word1.startX - i, word1.startY);
if (i == word1.text.length() - 1){
word1.setStartPoint(word1.startY, word1.startX);
word1.setEndPoint(word1.endY, word1.endX);
return word1;
}
}
}
}
return null;
}
private static Word detectRightDownWord(int[][] crossword, Word word) {
Word word1 = new Word(word.text);
word1.setStartPoint(word.startX, word.startY);
if ((crossword.length - word1.startY) < word1.text.length() |
(crossword.length - word1.startX) < word1.text.length())
return null;
else {
for (int i = 0; i < word1.text.length(); i++) {
if (crossword[word1.startX + i][word1.startY + i] != word1.text.charAt(i)) {
break;
} else {
word1.setEndPoint(word1.startX + i, word1.startY + i);
if (i == word1.text.length() - 1){
word1.setStartPoint(word1.startY, word1.startX);
word1.setEndPoint(word1.endY, word1.endX);
return word1;
}
}
}
}
return null;
}
private static Word detectLeftDownWord(int[][] crossword, Word word) {
Word word1 = new Word(word.text);
word1.setStartPoint(word.startX, word.startY);
if ((word1.startY + 1) < word1.text.length() |
(crossword.length - word1.startX) < word1.text.length())
return null;
else {
for (int i = 0; i < word1.text.length(); i++) {
if (crossword[word1.startX + i][word1.startY - i] != word1.text.charAt(i)) {
break;
} else {
word1.setEndPoint(word1.startX + i, word1.startY - i);
if (i == word1.text.length() - 1){
word1.setStartPoint(word1.startY, word1.startX);
word1.setEndPoint(word1.endY, word1.endX);
return word1;
}
}
}
}
return null;
}
private static Word detectRightUpWord(int[][] crossword, Word word) {
Word word1 = new Word(word.text);
word1.setStartPoint(word.startX, word.startY);
if ((crossword.length - word1.startY) < word1.text.length() |
(word1.startX + 1) < word1.text.length())
return null;
else {
for (int i = 0; i < word1.text.length(); i++) {
if (crossword[word1.startX - i][word1.startY + i] != word1.text.charAt(i)) {
break;
} else {
word1.setEndPoint(word1.startX - i, word1.startY + i);
if (i == word1.text.length() - 1){
word1.setStartPoint(word1.startY, word1.startX);
word1.setEndPoint(word1.endY, word1.endX);
return word1;
}
}
}
}
return null;
}
private static Word detectLeftUpWord(int[][] crossword, Word word) {
Word word1 = new Word(word.text);
word1.setStartPoint(word.startX, word.startY);
if ((word1.startY + 1) < word1.text.length() |
(word1.startX + 1) < word1.text.length())
return null;
else {
for (int i = 0; i < word1.text.length(); i++) {
if (crossword[word1.startX - i][word1.startY - i] != word1.text.charAt(i)) {
break;
} else {
word1.setEndPoint(word1.startX - i, word1.startY - i);
if (i == word1.text.length() - 1){
word1.setStartPoint(word1.startY, word1.startX);
word1.setEndPoint(word1.endY, word1.endX);
return word1;
}
}
}
}
return null;
}
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);
}
}
}