Где косяк?
Все доп проверки, которые тут выкладывают, проходит (и количество выводов, и последовательность совпадают)
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[][]{
{'f', 'd', 'e', 'r', 'l', 'k'},
{'u', 's', 'a', 'm', 'e', 'o'},
{'l', 'n', 'g', 'r', 'o', 'v'},
{'m', 'l', 'p', 'r', 'r', 'h'},
{'p', 'o', 'e', 'e', 'j', 'j'}
};
detectAllWords(crossword, "home", "same");
// int[][] crossword1 = new int[][] {
// {'a', 'b', 'c'},
// {'b', 'd', 'd'},
// {'c', 'd', 'd'}
// };
// detectAllWords(crossword1, "bb", "dd", "c").forEach(System.out::println);
//// Ожидаемый результат:
//// bb - (1, 0) - (0, 1)
//// bb - (0, 1) - (1, 0)
//// dd - (1, 1) - (2, 1)
//// dd - (1, 1) - (1, 2)
//// dd - (1, 1) - (2, 2)
//// dd - (2, 1) - (1, 1)
//// dd - (2, 1) - (2, 2)
//// dd - (2, 1) - (1, 2)
//// dd - (1, 2) - (2, 2)
//// dd - (1, 2) - (1, 1)
//// dd - (1, 2) - (2, 1)
//// dd - (2, 2) - (1, 2)
//// dd - (2, 2) - (2, 1)
//// dd - (2, 2) - (1, 1)
//// c - (2, 0) - (2, 0)
//// c - (0, 2) - (0, 2)
// int[][] crossword2 = 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(crossword2, "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[][] crossword3 = new int[][]{
// {'f', 'e', 'e', 'e', 'l', 'e'},
// {'u', 's', 'n', 'n', 'n', 'o'},
// {'l', 'e', 'n', 'o', 'n', 'e'},
// {'m', 'm', 'n', 'n', 'n', 'h'},
// {'p', 'e', 'e', 'e', 'j', 'e'}
// };
//
// detectAllWords(crossword3, "one");
// detectAllWords(crossword3, "one").forEach(System.out::println);
////Ожидаемый результат:
//// one - (3, 2) - (1, 0)
//// one - (3, 2) - (3, 0)
//// one - (3, 2) - (5, 0)
//// one - (3, 2) - (1, 2)
//// one - (3, 2) - (5, 2)
//// one - (3, 2) - (1, 4)
//// one - (3, 2) - (3, 4)
//// one - (3, 2) - (5, 4)
// int[][] crossword5 = new int[][] {
// {'r', 'm', 'a', 'r', 'r', 'e'},
// {'m', 'e', 'a', 'e', 'e', 'm'},
// {'s', 'a', 'm', 'e', 's', 'o'},
// {'m', 'o', 'p', 'o', 'o', 'h'},
// {'h', 'r', 'e', 'm', 'h', 'h'}
// };
// detectAllWords(crossword5, "home", "same", "homer").forEach(System.out::println);
//// Ожидаемый результат:
//// home - (5, 3) - (5, 0)
//// home - (0, 4) - (3, 1)
//// home - (4, 4) - (1, 1)
//// same - (0, 2) - (3, 2)
//// homer - (0, 4) - (4, 0)
//// homer - (4, 4) - (0, 0)
// int[][] crossword6 = new int[][] {
// {'a', 'a'},
// {'a', 'a'}
// };
//// detectAllWords(crossword6, "a");
// detectAllWords(crossword6, "aa").forEach(System.out::println);
// Ожидаемый результат:
// a - (0, 0) - (0, 0)
// a - (1, 0) - (1, 0)
// a - (0, 1) - (0, 1)
// a - (1, 1) - (1, 1)
/*
Ожидаемый результат
home - (5, 3) - (2, 0)
same - (1, 1) - (4, 1)
*/
}
public static List<Word> detectAllWords(int[][] crossword, String... words) {
List<Word> result = new ArrayList<>();
for (String word : words) {
char[] allLettersOfWord = word.toCharArray();
int tmpStartX;
int tmpStartY;
int tmpEndX;
int tmpEndY;
for (int i = 0; i < crossword.length; i++) {
for (int j = 0; j < crossword[i].length; j++) {
String tmpWord = "";
if ((char) crossword[i][j] == allLettersOfWord[0]) {
tmpWord += (char) crossword[i][j];
tmpStartX = j;
tmpStartY = i;
if (tmpWord.equals(word)) {
Word addedWord = new Word(tmpWord);
addedWord.setStartPoint(tmpStartX, tmpStartY);
addedWord.setEndPoint(tmpStartX, tmpStartY);
result.add(addedWord);
// break;
} else {
for (int k = j + 1; k < crossword[i].length; k++) {///////////////////////// направление по горизонтали слева направо
if ((char) crossword[i][k] == allLettersOfWord[tmpWord.length()]) {
tmpWord += (char) crossword[i][k];
if (tmpWord.equals(word)) {
tmpEndX = k;
tmpEndY = i;
Word addedWord = new Word(tmpWord);
addedWord.setStartPoint(tmpStartX, tmpStartY);
addedWord.setEndPoint(tmpEndX, tmpEndY);
result.add(addedWord);
tmpWord = "" + (char) crossword[i][j];
break;
}
} else {
tmpWord = "" + (char) crossword[i][j];
break;
}
}
for (int k = j - 1; k >= 0; k--) { //////////////////////// направление по горизонтали справа налево
if ((char) crossword[i][k] == allLettersOfWord[tmpWord.length()]) {
tmpWord += (char) crossword[i][k];
if (tmpWord.equals(word)) {
tmpEndX = k;
tmpEndY = i;
Word addedWord = new Word(tmpWord);
addedWord.setStartPoint(tmpStartX, tmpStartY);
addedWord.setEndPoint(tmpEndX, tmpEndY);
result.add(addedWord);
tmpWord = "" + (char) crossword[i][j];
break;
}
} else {
tmpWord = "" + (char) crossword[i][j];
break;
}
}
for (int k = i - 1; k >= 0; k--) { ///////////////////////// направление по вертикали снизу вверх
if ((char) crossword[k][j] == allLettersOfWord[tmpWord.length()]) {
tmpWord += (char) crossword[k][j];
if (tmpWord.equals(word)) {
tmpEndX = j;
tmpEndY = k;
Word addedWord = new Word(tmpWord);
addedWord.setStartPoint(tmpStartX, tmpStartY);
addedWord.setEndPoint(tmpEndX, tmpEndY);
result.add(addedWord);
tmpWord = "" + (char) crossword[i][j];
break;
}
} else {
tmpWord = "" + (char) crossword[i][j];
break;
}
}
for (int k = i + 1; k < crossword.length; k++) { ///////////////////// направление по вертикали сверху вниз
if ((char) crossword[k][j] == allLettersOfWord[tmpWord.length()]) {
tmpWord += (char) crossword[k][j];
if (tmpWord.equals(word)) {
tmpEndX = j;
tmpEndY = k;
Word addedWord = new Word(tmpWord);
addedWord.setStartPoint(tmpStartX, tmpStartY);
addedWord.setEndPoint(tmpEndX, tmpEndY);
result.add(addedWord);
tmpWord = "" + (char) crossword[i][j];
break;
}
} else {
tmpWord = "" + (char) crossword[i][j];
break;
}
}
int x = j + 1; ///////////////////////////////// по диагонали ввер и вправо
int y = i - 1;
while (x < crossword[i].length && y >= 0) {
if ((char) crossword[y][x] == allLettersOfWord[tmpWord.length()]) {
tmpWord += (char) crossword[y][x];
x++;
y--;
if (tmpWord.equals(word)) {
tmpEndX = x - 1;
tmpEndY = y + 1;
Word addedWord = new Word(tmpWord);
addedWord.setStartPoint(tmpStartX, tmpStartY);
addedWord.setEndPoint(tmpEndX, tmpEndY);
result.add(addedWord);
tmpWord = "" + (char) crossword[i][j];
break;
}
} else {
tmpWord = "" + (char) crossword[i][j];
break;
}
}
x = j - 1; /////////////////////////////////////// по диагонали ввер и влево
y = i - 1;
while (x >= 0 && y >= 0) {
if ((char) crossword[y][x] == allLettersOfWord[tmpWord.length()]) {
tmpWord += (char) crossword[y][x];
x--;
y--;
if (tmpWord.equals(word)) {
tmpEndX = x + 1;
tmpEndY = y + 1;
Word addedWord = new Word(tmpWord);
addedWord.setStartPoint(tmpStartX, tmpStartY);
addedWord.setEndPoint(tmpEndX, tmpEndY);
result.add(addedWord);
tmpWord = "" + (char) crossword[i][j];
break;
}
} else {
tmpWord = "" + (char) crossword[i][j];
break;
}
}
x = j + 1; //////////////////////////////////////// по диагонали вниз и вправо
y = i + 1;
while (x < crossword[i].length && y < crossword.length) {
if ((char) crossword[y][x] == allLettersOfWord[tmpWord.length()]) {
tmpWord += (char) crossword[y][x];
x++;
y++;
if (tmpWord.equals(word)) {
tmpEndX = x - 1;
tmpEndY = y - 1;
Word addedWord = new Word(tmpWord);
addedWord.setStartPoint(tmpStartX, tmpStartY);
addedWord.setEndPoint(tmpEndX, tmpEndY);
result.add(addedWord);
tmpWord = "" + (char) crossword[i][j];
break;
}
} else {
tmpWord = "" + (char) crossword[i][j];
break;
}
}
x = j - 1; //////////////////////////////////////// по диагонали вниз и влево
y = i + 1;
while (x >= 0 && y < crossword.length) {
if ((char) crossword[y][x] == allLettersOfWord[tmpWord.length()]) {
tmpWord += (char) crossword[y][x];
x--;
y++;
if (tmpWord.equals(word)) {
tmpEndX = x + 1;
tmpEndY = y - 1;
Word addedWord = new Word(tmpWord);
addedWord.setStartPoint(tmpStartX, tmpStartY);
addedWord.setEndPoint(tmpEndX, tmpEndY);
result.add(addedWord);
break;
}
} else {
// tmpWord = "" + (char) crossword[i][j];
break;
}
}
}
}
}
}
}
return result;
}
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);
}
}
}