Доброго времени суток! Никак не проходит по последнему пункту задача. Уже проверяла слова разных длин, во всех направлениях, координаты считает верно. Может кто подскажет в чем ошибка?
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");
/*
Ожидаемый результат
home - (5, 3) - (2, 0)
same - (1, 1) - (4, 1)
*/
}
public static void searchHorizontal(Word word, int[][] crossword, String searchWord) {
int lenWord = searchWord.length();
int rows = crossword.length;
int columns = crossword[0].length;
//по горизонтали:
for (int x = 0; x < rows; x++) {
StringBuilder sb = new StringBuilder();
for (int y = 0; y < columns; y++) {
sb.append((char) crossword[x][y]);
}
//-->
if (sb.toString().contains(searchWord)) {
int indexWord = sb.indexOf(searchWord);
word.setStartPoint(indexWord, x);
word.setEndPoint(indexWord + lenWord - 1, x);
} else {
//<--
StringBuilder reverseStringBuilder = new StringBuilder(searchWord);
String reverseSearchString = reverseStringBuilder.reverse().toString();
if (sb.toString().contains(reverseSearchString)) {
int indexWord = sb.indexOf(reverseSearchString);
word.setStartPoint(indexWord + lenWord - 1, x);
word.setEndPoint(indexWord, x);
}
}
}
}
public static void searchVertical(Word word, int[][] crossword, String searchWord) {
int lenWord = searchWord.length();
int rows = crossword.length;
int columns = crossword[0].length;
//по вертикали:
for (int y = 0; y < columns; y++) {
StringBuilder sb = new StringBuilder();
for (int x = 0; x < rows; x++) {
sb.append((char) crossword[x][y]);
}
//вниз
if (sb.toString().contains(searchWord)) {
int indexWord = sb.indexOf(searchWord);
word.setStartPoint(y, indexWord);
word.setEndPoint(y, indexWord + lenWord - 1);
} //вверх
else {
StringBuilder reverseStringBuilder = new StringBuilder(searchWord);
String reverseSearchString = reverseStringBuilder.reverse().toString();
if (sb.toString().contains(reverseSearchString)) {
int indexWord = sb.indexOf(reverseSearchString);
word.setEndPoint(y, indexWord);
word.setStartPoint(y, indexWord + lenWord - 1);
}
}
}
}
public static void searchDiagonal_I(Word word, int[][] crossword, String searchWord) {
int lenWord = searchWord.length();
int rows = crossword.length;
int columns = crossword[0].length;
int min = Math.min(rows, columns);
//по диагонали(I):
//левый треугольник
// for (int i = 0; i < columns - 1; i++) {
for (int i = 0; i < min - 1; i++) {
int x = rows - 1 - i;
int x0 = x;
int y0 = 0;
StringBuilder sb = new StringBuilder();
for (int y = 0; x < rows; x++, y++) {
sb.append((char) crossword[x][y]);
}
//--> слева-направо, сверху-вниз
if (sb.toString().contains(searchWord)) {
int indexWord = sb.indexOf(searchWord);
word.setStartPoint(y0 + indexWord, x0 + indexWord);
word.setEndPoint(indexWord + lenWord - 1, x0 + indexWord + lenWord - 1);
} //<-- справа-налево, снизу-вверх(обратная строка)
else {
StringBuilder reverseStringBuilder = new StringBuilder(searchWord);
String reverseSearchString = reverseStringBuilder.reverse().toString();
if (sb.toString().contains(reverseSearchString)) {
int indexWord = sb.indexOf(reverseSearchString);
word.setStartPoint(indexWord + lenWord - 1, x0 + indexWord + lenWord - 1);
word.setEndPoint(y0 + indexWord, x0 + indexWord);
}
}
}
/////////////////////////////////////
//правый треугольник
// for (int i = 0; i < columns - 1; i++) {
for (int i = 0; i < min - 1; i++) {
int y = 0;
int x0 = 1 + i;
int y0 = y;
StringBuilder sb = new StringBuilder();
for (int x = 1 + i; x < columns; x++, y++) {
sb.append((char) crossword[y][x]);
}
//--> слева-направо, сверху-вниз
if (sb.toString().contains(searchWord)) {
int indexWord = sb.indexOf(searchWord);
word.setStartPoint(x0 + indexWord, y0 + indexWord);
word.setEndPoint(x0 + indexWord + lenWord - 1, indexWord + lenWord - 1);
} else {
//<-- справа-налево, снизу-вверх(обратная строка)
StringBuilder reverseStringBuilder = new StringBuilder(searchWord);
String reverseSearchString = reverseStringBuilder.reverse().toString();
if (sb.toString().contains(reverseSearchString)) {
int indexWord = sb.indexOf(reverseSearchString);
word.setStartPoint(indexWord + lenWord - 1, x0 + indexWord + lenWord - 1);
word.setEndPoint(y0 + indexWord, x0 + indexWord);
}
}
}
/////////////////////////////////////
//правый треугольник
// for (int i = 0; i < columns - 1; i++) {
for (int i = 0; i < min - 1; i++) {
int y = 0;
int x0 = 1 + i;
int y0 = y;
StringBuilder sb = new StringBuilder();
for (int x = 1 + i; x < columns; x++, y++) {
sb.append((char) crossword[y][x]);
}
//--> слева-направо, сверху-вниз
if (sb.toString().contains(searchWord)) {
int indexWord = sb.indexOf(searchWord);
word.setStartPoint(x0 + indexWord, y0 + indexWord);
word.setEndPoint(x0 + indexWord + lenWord - 1, indexWord + lenWord - 1);
} else {
//<-- справа-налево, снизу-вверх(обратная строка)
StringBuilder reverseStringBuilder = new StringBuilder(searchWord);
String reverseSearchString = reverseStringBuilder.reverse().toString();
if (sb.toString().contains(reverseSearchString)) {
int indexWord = sb.indexOf(reverseSearchString);
word.setStartPoint(x0 + indexWord + lenWord - 1, indexWord + lenWord - 1);
word.setEndPoint(x0 + indexWord, y0 + indexWord);
}
}
}
}
public static void searchDiagonal_II(Word word, int[][] crossword, String searchWord) {
int lenWord = searchWord.length();
int rows = crossword.length;
int columns = crossword[0].length;
int min = Math.min(rows, columns);
//по диагонали(II):
//первый треугольник
for (int i = min - 1; i >= 0; i--) {
int x = i;
int x0 = x;
StringBuilder sb = new StringBuilder();
for (int y = 0; y < columns && x >= 0; x--, y++) {
sb.append((char) crossword[x][y]);
}
//--> слева-направо, снизу-вверх
if (sb.toString().contains(searchWord)) {
int indexWord = sb.indexOf(searchWord);
word.setStartPoint(indexWord, x0 - indexWord);
word.setEndPoint(indexWord + lenWord - 1, x0 - indexWord - (lenWord - 1));
} //<-- справа-налево, сверху-вниз(обратная строка)
else {
StringBuilder reverseStringBuilder = new StringBuilder(searchWord);
String reverseSearchString = reverseStringBuilder.reverse().toString();
if (sb.toString().contains(reverseSearchString)) {
int indexWord = sb.indexOf(reverseSearchString);
word.setEndPoint(indexWord, x0 - indexWord);
word.setStartPoint(indexWord + lenWord - 1, x0 - indexWord - (lenWord - 1));
}
}
}
/////////////////////////////////////
//второй треугольник
for (int i = 0; i < min; i++) {
int x = min - 1;
int x0 = x;
int y0 = 1 + i;
StringBuilder sb = new StringBuilder();
for (int y = 1 + i; y < columns && x >= 0; x--, y++) {
sb.append((char) crossword[x][y]);
}
//--> слева-направо, снизу-вверх
if (sb.toString().contains(searchWord)) {
int indexWord = sb.indexOf(searchWord);
word.setStartPoint(y0 - indexWord, x0 - indexWord);
word.setEndPoint(y0 - indexWord + (lenWord - 1), x0 - indexWord - (lenWord - 1));
} //<-- справа-налево, сверху-вниз(обратная строка)
else {
StringBuilder reverseStringBuilder = new StringBuilder(searchWord);
String reverseSearchString = reverseStringBuilder.reverse().toString();
if (sb.toString().contains(reverseSearchString)) {
int indexWord = sb.indexOf(reverseSearchString);
word.setStartPoint(y0 - indexWord + (lenWord - 1), x0 - indexWord - (lenWord - 1));
word.setEndPoint(y0 - indexWord, x0 - indexWord);
}
}
}
}
public static Word getWord(int[][] crossword, String searchWord) {
Word addWord = new Word(searchWord);
//по горизонтали:
searchHorizontal(addWord, crossword, searchWord);
//по вертикали:
searchVertical(addWord, crossword, searchWord);
//по диагонали(I):
searchDiagonal_I(addWord, crossword, searchWord);
//по диагонали(II):
searchDiagonal_II(addWord, crossword, searchWord);
System.out.println(addWord.toString());
return addWord;
}
public static List<Word> detectAllWords(int[][] crossword, String... words) {
ArrayList<Word> list = new ArrayList<>();
for (String word : words) {
Word findWord = getWord(crossword, word);
list.add(findWord);
}
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);
}
}
}