Код гавно, хрен разберешь че где-то, но лучше не смог...
Разбираться в нем и не прошу)) но если у кого-то будут дельные советы я открыт для предложений)
подкинте лучше вариант тестов что бы мог ошибку найти
с моими тестами вывод выглядит норм но валидатор так не считает.
12 - (5, 3) - (6, 4)
12 - (5, 3) - (4, 2)
12 - (5, 3) - (6, 3)
12 - (5, 3) - (4, 3)
12 - (5, 3) - (5, 4)
12 - (5, 3) - (5, 2)
34 - (9, 6) - (10, 7)
34 - (9, 6) - (8, 5)
34 - (9, 6) - (10, 6)
34 - (9, 6) - (8, 6)
34 - (9, 6) - (9, 7)
34 - (9, 6) - (9, 5)
344 - (9, 6) - (7, 4)
344 - (9, 6) - (7, 6)
344 - (9, 6) - (9, 4)
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', 'd', 'e', 'r', 'w', 'x'}, //0
{'u', 's', 'a', 'm', 'e', 'o', 's', 'a', 'm', 'e', 'w'}, //1
{'l', 'n', 'g', 'r', '2', '2', '2', 'g', 'r', 'o', 'v'}, //2
{'m', 'p', 'p', 'r', '2', '1', '2', 'p', 'r', 'r', 'h'}, //3
{'p', 'h', 'e', 'e', '2', '2', '2', '4', '4', '4', '4'}, //4
{'l', '2', 'g', 'r', 'o', 'v', 'n', '4', '4', '4', '4'}, //5
{'m', 'l', 'p', 'r', 'r', 'h', 'l', '4', '4', '3', '4'}, //6
{'p', 'o', 'e', 'e', 'j', 'j', 'o', '4', '4', '4', '4'} //7
};
List<Word> words = (detectAllWords(crossword, "12", "34", "344"));
for (Word w : words) {
System.out.println(w);
}
/*
Ожидаемый результат
home - (5, 3) - (2, 0)
same - (1, 1) - (4, 1)
*/
}
public static List<Word> detectAllWords(int[][] crossword, String... words) {
List<Word> wordArrays = new ArrayList<>();
List<Word> word1 = null;
for (String word : words) {
for (int i = 0; i < crossword.length; i++) {
for (int j = 0; j < crossword[i].length; j++) {
String StartsLitter = String.valueOf((char)crossword[i][j]);
if (word.startsWith(StartsLitter)) {
int wordLength = word.length() - 1;
word1 = CreateWord(new Letter(crossword, i, j, wordLength));
for (Word value : word1) {
if (value != null && value.getText().equals(word)) {
wordArrays.add(value);
}
}
}
}
}
}
return wordArrays;
}
private static List<Word> CreateWord(Letter letter) {
List<Word> list = new ArrayList<>();
list.add(getWordOnPositiveDiagonal(letter));
list.add(getWordOnNegativeDiagonal(letter));
list.add(getWordOnPositiveHorizontal(letter));
list.add(getWordOnNegativeHorizontal(letter));
list.add(getWordOnPositiveVertical(letter));
list.add(getWordOnNegativeVertical(letter));
return list;
}
private static Word getWordOnPositiveDiagonal (Letter letter) {
StringBuilder stringBuilder = new StringBuilder();
if (letter.getI() + letter.getWordLength() < letter.getCrosswordHeight() &&
letter.getJ() + letter.getWordLength() < letter.getCrosswordLength()) {
int StartPointI = letter.getI();
int StartPointJ = letter.getJ();
int EndPointI = letter.getI() + letter.getWordLength();
int EndPointJ = letter.getJ() + letter.getWordLength();
while (StartPointI <= EndPointI && StartPointJ <= EndPointJ) {
char ch = (char) letter.getCrossword()[StartPointI++][StartPointJ++];
stringBuilder.append(ch);
}
Word word = new Word(stringBuilder.toString().trim());
word.setStartPoint(letter.getJ(), letter.getI());
word.setEndPoint(EndPointJ, EndPointI);
return word;
} else return null;
}
private static Word getWordOnNegativeDiagonal(Letter letter) {
StringBuilder stringBuilder = new StringBuilder();
if (letter.getI() - letter.getWordLength() >= 0 &&
letter.getJ() - letter.getWordLength() >= 0) {
int StartPointI = letter.getI();
int StartPointJ = letter.getJ();
int EndPointI = letter.getI() - letter.getWordLength();
int EndPointJ = letter.getJ() - letter.getWordLength();
while (StartPointI >= EndPointI && StartPointJ >= EndPointJ) {
char ch = (char) letter.getCrossword()[StartPointI--][StartPointJ--];
stringBuilder.append(ch);
}
Word word = new Word(stringBuilder.toString());
word.setStartPoint(letter.getJ(), letter.getI());
word.setEndPoint(EndPointJ, EndPointI);
return word;
} else return null;
}
private static Word getWordOnPositiveHorizontal(Letter letter) {
StringBuilder stringBuilder = new StringBuilder();
if (letter.getJ() + letter.getWordLength() < letter.getCrosswordLength()) {
int StartPointJ = letter.getJ();
int EndPointJ = letter.getJ() + letter.getWordLength();
while (StartPointJ <= EndPointJ) {
char ch = (char) letter.getCrossword()[letter.getI()][StartPointJ++];
stringBuilder.append(ch);
}
Word word = new Word(stringBuilder.toString());
word.setStartPoint(letter.getJ(), letter.getI());
word.setEndPoint(EndPointJ, letter.getI());
return word;
} else return null;
}
private static Word getWordOnNegativeHorizontal (Letter letter) {
StringBuilder stringBuilder = new StringBuilder();
if (letter.getJ() - letter.getWordLength() >= 0) {
int StartPointJ = letter.getJ();
int EndPointJ = letter.getJ() - letter.getWordLength();
while (StartPointJ >= EndPointJ) {
char ch = (char) letter.getCrossword()[letter.getI()][StartPointJ--];
stringBuilder.append(ch);
}
Word word = new Word(stringBuilder.toString());
word.setStartPoint(letter.getJ(), letter.getI());
word.setEndPoint(EndPointJ, letter.getI());
return word;
} else return null;
}
private static Word getWordOnPositiveVertical(Letter letter) {
StringBuilder stringBuilder = new StringBuilder();
if (letter.getI() + letter.getWordLength() < letter.getCrosswordHeight()) {
int StartPointI = letter.getI();
int EndPointI = letter.getI() + letter.getWordLength();
while (StartPointI <= EndPointI) {
char ch = (char) letter.getCrossword()[StartPointI++][letter.getJ()];
stringBuilder.append(ch);
}
Word word = new Word(stringBuilder.toString());
word.setStartPoint(letter.getJ(), letter.getI());
word.setEndPoint(letter.getJ(), EndPointI);
return word;
} else return null;
}
private static Word getWordOnNegativeVertical(Letter letter) {
StringBuilder stringBuilder = new StringBuilder();
if (letter.getI() - letter.getWordLength() >= 0) {
int StartPointI = letter.getI();
int EndPointI = letter.getI() - letter.getWordLength();
while (StartPointI >= EndPointI) {
char ch = (char) letter.crossword[StartPointI--][letter.getJ()];
stringBuilder.append(ch);
}
Word word = new Word(stringBuilder.toString());
word.setStartPoint(letter.getJ(), letter.getI());
word.setEndPoint(letter.getJ(), EndPointI);
return word;
} 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;
}
public String getText() {
return text;
}
@Override
public String toString() {
return String.format("%s - (%d, %d) - (%d, %d)", text, startX, startY, endX, endY);
}
}
public static class Letter {
private int [][] crossword;
private int i;
private int j;
private int wordLength;
private int crosswordLength;
private int crosswordHeight;
public int[][] getCrossword() {
return crossword;
}
public int getI() {
return i;
}
public int getJ() {
return j;
}
public int getWordLength() {
return wordLength;
}
public int getCrosswordLength() {
return crosswordLength;
}
public int getCrosswordHeight() {
return crosswordHeight;
}
public Letter(int [][] crossword, int i, int j, int wordLength) {
this.crossword = crossword;
this.i = i;
this.j = j;
this.wordLength = wordLength;
this.crosswordHeight = crossword.length;
this.crosswordLength = crossword[0].length;
}
@Override
public String toString() {
return String.format("Coordinate i = %d, j = %d, The word has %s litters", this.i, this.j, this.wordLength + 1);
}
}
}