Подскажите, в чем ошибка?
Вроде разные варианты тестировал, слова из 1, 2, 3 и т.д. букв, разные размеры массивов, направления слов во все стороны. Но все равно ошибка...
package com.javarush.task.task20.task2027;
import java.util.List;
import java.util.ArrayList;
/*
Кроссворд
*/
public class Solution {
public static void main(String[] args) throws Exception {
int[][] crossword = new int[][]{
{'f', 'e', 'e', 'e', 'l', 'e'},
{'u', 's', 'n', 'n', 'n', 'k'},
{'l', 'e', 'n', 'o', 'n', 'e'},
{'m', 'm', 'n', 'n', 'n', 'h'},
{'p', 'e', 'e', 'e', 'j', 'e'}
};
List<Word> result = detectAllWords(crossword, "one", "e");
//System.out.println(abc.size());
for(Word w : result){
System.out.println(w.toString());
}
/*
Ожидаемый результат
home - (5, 3) - (2, 0)
same - (1, 1) - (4, 1)
*/
}
public static List<Word> detectAllWords(int[][] crossword, String... words) throws Exception {
String[] inputWords;
inputWords = words;
List<Word> wordList = new ArrayList<>();
for(String s : words){ // перебираем слова
if(s.length() == 0) continue;
//System.out.println("New cicle, word: " + s);
List<Word> findedWord = new ArrayList<>();
ArrayList<Point> firstLetter = null;
ArrayList<Point> lastLetter = null;
ArrayList<Point> subWordMatchedByLength = new ArrayList<>();
firstLetter = getAllPointForLetter(crossword, s.charAt(0));
lastLetter = getAllPointForLetter(crossword, s.charAt(s.length() - 1));
//System.out.println("For word " + s + " found first letter: " + firstLetter.size() + " and last letter: " + lastLetter.size());
if(firstLetter.size() == 0 || lastLetter.size() == 0) {
//System.out.println("For word " + s + " found first letter: " + firstLetter.size() + " and last letter: " + lastLetter.size());
continue; // если не нашлось первой или последней буквы, берем следующее слово
}
//System.out.println("checkWordLength: " + checkWordLength(firstLetter, lastLetter, s).size());
subWordMatchedByLength.addAll(checkWordLength(firstLetter, lastLetter, s));
//System.out.println("For word " + s + " found subWordMatchedByLength: " + subWordMatchedByLength.size());
findedWord = getWordMatches(crossword, subWordMatchedByLength, s);
if(findedWord != null){
wordList.addAll(findedWord);
}
}
return wordList;
}
public static class Point {
private int i;
private int j;
public Point(int i, int j){
this.i = i;
this.j = j;
}
public int getI(){
return i;
}
public int getJ(){
return j;
}
}
public static ArrayList<Point> getAllPointForLetter(int[][] crossword, char c) throws Exception{
ArrayList<Point> list = new ArrayList<>();
for(int i = 0; i < crossword.length; i++){
for(int j = 0; j < crossword[i].length; j++){
if(c == crossword[i][j]) list.add(new Point(i, j));
}
}
return list;
}
public static ArrayList<Point> checkWordLength(List<Point> firstLetter, List<Point> lastLetter, String word) throws Exception{
int len = word.length();
ArrayList<Point> startEndWordPointPair = new ArrayList<>();
for(Point pf : firstLetter){
int fi = pf.getI();
int fj = pf.getJ();
for(Point pl : lastLetter){
int li = pl.getI();
int lj = pl.getJ();
if(len == 1){
startEndWordPointPair.add(new Point(fi, fj));
startEndWordPointPair.add(new Point(fi, fj));
break;
}
else if(Math.abs(fi - li) == (len - 1) && Math.abs(fj - lj) == (len - 1)) { //слово расположено по диагонали
startEndWordPointPair.add(new Point(fi, fj));
startEndWordPointPair.add(new Point(li, lj));
}
else if(Math.abs(fi - li) == (len - 1) && Math.abs(fj - lj) == 0) { // слово расположено по вертикали
startEndWordPointPair.add(new Point(fi, fj));
startEndWordPointPair.add(new Point(li, lj));
}
else if(Math.abs(fi - li) == 0 && Math.abs(fj - lj) == (len - 1)) { // слово раположено по горизонтали
startEndWordPointPair.add(new Point(fi, fj));
startEndWordPointPair.add(new Point(li, lj));
}
}
}
return startEndWordPointPair;
}
public static List<Word> getWordMatches(int[][] crossword, List<Point> subWordMatchedByLength, String s) throws Exception { // подаем
ArrayList<Word> findednWordList = new ArrayList<>();
for(int j = 1; j < subWordMatchedByLength.size(); j = j+2){
int fi = subWordMatchedByLength.get(j-1).getI(); //first and last letters coordinats
int fj = subWordMatchedByLength.get(j-1).getJ();
int li = subWordMatchedByLength.get(j).getI();
int lj = subWordMatchedByLength.get(j).getJ();
boolean matched = true;
//boolean oneLetterWord = false;
if(fi == li && fj < lj){ //right direction
for(int i = 1; i < s.length()-1; i++){
if(s.charAt(i) != crossword[fi][fj+i]){
matched = false;
break;
}
}
if(!matched) break;
}
else if(fi == li && fj > lj){ //left
for(int i = 1; i < s.length()-1; i++){
if(s.charAt(i) != crossword[fi][fj-i]){
matched = false;
break;
}
}
if(!matched) break;
}
else if(fi < li && fj == lj){ //down
for(int i = 1; i < s.length()-1; i++){
if(s.charAt(i) != crossword[fi+i][fj]){
matched = false;
break;
}
}
if(!matched) break;
}
else if(fi > li && fj == lj){ //up
for(int i = 1; i < s.length()-1; i++){
if(s.charAt(i) != crossword[fi-i][fj]){
matched = false;
break;
}
}
if(!matched) break;
}
else if(fi > li && fj < lj){ //up-right
for(int i = 1; i < s.length()-1; i++){
if(s.charAt(i) != crossword[fi-i][fj+i]){
matched = false;
break;
}
}
if(!matched) break;
}
else if(fi < li && fj < lj){ //down-right
for(int i = 1; i < s.length()-1; i++){
if(s.charAt(i) != crossword[fi+i][fj+i]){
matched = false;
break;
}
}
if(!matched) break;
}
else if(fi < li && fj > lj){ //down-left
for(int i = 1; i < s.length()-1; i++){
if(s.charAt(i) != crossword[fi+i][fj-i]){
matched = false;
break;
}
}
if(!matched) break;
}
else if(fi > li && fj > lj){ //up-left
for(int i = 1; i < s.length()-1; i++){
if(s.charAt(i) != crossword[fi-i][fj-i]){
matched = false;
break;
}
}
}
Word findedWord = new Word(s);
findedWord.setStartPoint(fj, fi);
findedWord.setEndPoint(lj, li);
findednWordList.add(findedWord);
}
/*if(oneLetterWord) {
Word findedWord = new Word(s);
findedWord.setStartPoint(fj, fi);
findedWord.setEndPoint(fj, fi);
findednWordList.add();
}*/
//System.out.println("Matched words: " + findednWordList.size());
return findednWordList;
}
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);
}
}
}