Я не нашел в инете как решить эту задачу просто и быстро, поэтому пытаюсь решить ее самым тупым способом. И оно даже все слова находит (по горизонтали, вертикали.... как угодно расположенные). валидатор говорит: "Ты неправильно определил положение граничных букв(ы) слов(а)." ну всеж правильно...
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,  "ran","hj","epnu","jrra","ev","fsgrj","mnar","prek","leorj","mrr","jhvok","pga","jjee","vorg","lprr","same");
        /*
Ожидаемый результат
home - (5, 3) - (2, 0)
same - (1, 1) - (4, 1)
         */
    }

    public static List<Word> detectAllWords(int[][] crossword, String... words)
    {
        List<Word> list = new ArrayList<>();
        int xLen;

        String word;
        char ch;
        char chThis;
        String str = "";
        boolean ok = false;
        int finalX = 0;
        int finalY = 0;
        int startX = 0;
        int startY = 0;

        downLine:
        // Перебираем слова которые надо найти
        for (int i = 0; i < words.length; i++)
        {
            word = words[i];
            ok = false;
            downToDo:
            // Перебираем буквы в слове, которое нужно найти
            for (int j = 0; j < word.length(); j ++)
            {
                ch = word.charAt(j);
                // Перебираем строку массива
                for (int k = 0; k < crossword.length; k ++)
                {
                    // Перебираем столбец массива

                    for (int t = 0; t < crossword[k].length; t ++)
                    {
                        chThis = (char) crossword[k][t];

                        if (String.valueOf(ch).equals(String.valueOf(chThis)))
                        {
                            // Если был найден символ, совпадающий с первым символом в слове, то проверить 8 направлений на наличие слова
                            // >>>>1е тупо вправо
                            if (!ok)
                            {
                                xLen = (crossword[k].length - t) >= word.length() ? word.length() : crossword[k].length - t;
                                down:
                                if (xLen < word.length())
                                {
                                    str = "";
                                    break down;
                                }
                                else
                                    {
                                        for (int x = t; x < (word.length() + t); x++)
                                        {
                                            str = str + (char) (crossword[k][x]);
                                        }
                                        if (word.equals(str))
                                        {
                                            System.out.println("Найдено слово вправо по горизонтали вправо: " + word);

                                            Word word1 = new Word(word);
                                            startX = k;
                                            startY = t;
                                            finalX = k;
                                            finalY = t + word.length() - 1;
                                            System.out.println("Кординаты: " + startX + "-" + startY + ":" + finalX + "-" + finalY);
                                            word1.setStartPoint(k,t);
                                            word1.setEndPoint(k,t + word.length());
                                            list.add(word1);
                                            ok = true;
                                            str = "";
                                            break downToDo;
                                        }
                                        str = "";
                                    }

                                // 2е тупо влево
                                xLen = t >= (word.length() - 1) ? word.length() : 0;

                                down:
                                if (xLen < word.length())
                                {
                                    str = "";
                                    break down;
                                }
                                else
                                    {
                                        for (int x = t; x > (t - word.length()) ;x--)
                                        {
                                            str = str + (char) (crossword[k][x]);
                                        }
                                        if (word.equals(str))
                                        {
                                            System.out.println("Найдено слово влево по горизонтали " + word);
                                            Word word1 = new Word(word);
                                            startY = k;
                                            startX = t;
                                            finalY = k;
                                            finalX = t - (word.length() - 1);
                                            System.out.println("Кординаты: " + startX + "-" + startY + ":" + finalX + "-" + finalY);

                                            word1.setStartPoint(startX,startY);
                                            word1.setEndPoint(finalX,finalY);
                                            list.add(word1);
                                            ok = true;
                                            str = "";
                                            break downToDo;
                                        }
                                        str = "";
                                    }

                                // 3e тупо вверх
                                xLen = k - (word.length() - 1) >= 0 ? word.length() : 0;
                                down:
                                if (xLen < word.length())
                                {
                                    str = "";
                                    break down;
                                }
                                else
                                {
                                    for (int x = k; x >= k - (word.length() - 1);x--)
                                    {
                                        str = str + (char) (crossword[x][t]);
                                    }
                                    if (word.equals(str))
                                    {
                                        System.out.println("Найдено слово по вертикали вверх: " + word);
                                        Word word1 = new Word(word);
                                        startY = k;
                                        startX = t;
                                        finalY = k - word.length() + 1;
                                        finalX = t;
                                        System.out.println("Кординаты: " + startX + "-" + startY + ":" + finalX + "-" + finalY);

                                        word1.setStartPoint(startX,startY);
                                        word1.setEndPoint(finalX,finalY);
                                        list.add(word1);
                                        ok = true;
                                        str = "";
                                        break downToDo;
                                    }
                                    str = "";
                                }


                                // 4e тупо вниз
                                xLen = crossword.length - k >= word.length() ? word.length() : 0;
                                down:
                                if (xLen < word.length())
                                {
                                    str = "";
                                    break down;
                                }
                                else
                                {
                                    for (int x = k; x < (k + word.length()); x++)
                                    {
                                        str = str + (char) (crossword[x][t]);
                                    }
                                    if (word.equals(str))
                                    {
                                        System.out.println("Найдено слово по вертикали вниз: " + word);
                                        Word word1 = new Word(word);
                                        startY = k;
                                        startX = t;
                                        finalY = k + word.length() - 1;
                                        finalX = t;
                                        System.out.println("Кординаты: " + startX + "-" + startY + ":" + finalX + "-" + finalY);

                                        word1.setStartPoint(startX,startY);
                                        word1.setEndPoint(finalX,finalY);
                                        list.add(word1);
                                        ok = true;
                                        str = "";
                                        break downToDo;
                                    }
                                    str = "";
                                }


                                // 5e вправо вверх по диагонали
                                xLen = Math.sqrt(Math.pow(k+1,2) + Math.pow(crossword[k].length - (t + 1),2)) >= word.length() ? word.length() : 0;
                                down:
                                if (xLen < word.length())
                                {
                                    str = "";
                                    break down;
                                }
                                else
                                {
                                    downTo:
                                    for (int x = k, y = t; x < (k + word.length()); x--, y ++)
                                    {
                                        if (x == 0 || y == (crossword[k].length - 1))
                                        {
                                            str = str + (char) (crossword[x][y]);
                                            finalX = y;
                                            finalY = x;
                                            break downTo;
                                        }
                                        str = str + (char) (crossword[x][y]);
                                        if (str.length() == word.length())
                                        {
                                            finalX = y;
                                            finalY = x;
                                            break downTo;
                                        }
                                    }
                                    if (word.equals(str))
                                    {
                                        System.out.println("Найдено слово вправо верх по диагонали: " + word);
                                        Word word1 = new Word(word);
                                        startY = k;
                                        startX = t;
                                        //finalY = k + word.length() - 1;
                                       // finalX = t;
                                        System.out.println("Кординаты: " + startX + "-" + startY + ":" + finalX + "-" + finalY);
                                        word1.setStartPoint(startX,startY);
                                        word1.setEndPoint(finalX,finalY);
                                        list.add(word1);
                                        ok = true;
                                        str = "";
                                        break downToDo;
                                    }
                                    str = "";
                                }

                                // 6e вправо вниз по диагонали
                                xLen = Math.sqrt(Math.pow(crossword.length - (k + 1), 2) + Math.pow(crossword[k].length - (t + 1), 2)) >= word.length() ? word.length() : 0;
                                down:
                                if (xLen < word.length())
                                {
                                    str = "";
                                    break down;
                                }
                                else
                                {
                                    downTo:
                                    for (int x = k, y = t; x < (k + word.length()); x++, y ++)
                                    {
                                        if (x == (crossword.length - 1) || y == (crossword[k].length - 1))
                                        {
                                            str = str + (char) (crossword[x][y]);
                                            finalX = y;
                                            finalY = x;
                                            break downTo;
                                        }
                                        str = str + (char) (crossword[x][y]);
                                        if (str.length() == word.length())
                                        {
                                            finalX = y;
                                            finalY = x;
                                            break downTo;

                                        }
                                    }
                                    if (word.equals(str))
                                    {
                                        System.out.println("Найдено слово вправо вниз по диагонали: " + word);
                                        Word word1 = new Word(word);
                                        startY = k;
                                        startX = t;
                                        //finalY = k + word.length() - 1;
                                        // finalX = t;
                                        System.out.println("Кординаты: " + startX + "-" + startY + ":" + finalX + "-" + finalY);
                                        word1.setStartPoint(startX,startY);
                                        word1.setEndPoint(finalX,finalY);
                                        list.add(word1);
                                        ok = true;
                                        str = "";
                                        break downToDo;
                                    }
                                    str = "";
                                }


                                // 7e лево вверх по диагонали
                                xLen = Math.sqrt(Math.pow(k + 1,2) + Math.pow(t + 1,2)) >= word.length() ? word.length() : 0;
                                down:
                                if (xLen < word.length())
                                {
                                    str = "";
                                    break down;
                                }
                                else
                                {
                                    downTo:
                                    for (int x = k, y = t; x < (k + word.length()); x--, y --)
                                    {
                                        if (x == 0 || y == 0)
                                        {
                                            str = str + (char) (crossword[x][y]);
                                            finalX = y;
                                            finalY = x;
                                            break downTo;
                                        }
                                        str = str + (char) (crossword[x][y]);
                                        if (str.length() == word.length())
                                        {
                                            finalX = y;
                                            finalY = x;
                                            break downTo;
                                        }
                                    }
                                    if (word.equals(str))
                                    {
                                        System.out.println("Найдено слово влево вверх по диагонали: " + word);
                                        Word word1 = new Word(word);
                                        startY = k;
                                        startX = t;
                                        //finalY = k + word.length() - 1;
                                        // finalX = t;
                                        System.out.println("Кординаты: " + startX + "-" + startY + ":" + finalX + "-" + finalY);
                                        word1.setStartPoint(startX,startY);
                                        word1.setEndPoint(finalX,finalY);
                                        list.add(word1);
                                        ok = true;
                                        str = "";
                                        break downToDo;
                                    }
                                    str = "";
                                }

                                // 8e влево вниз по диагонали
                                xLen = Math.sqrt(Math.pow(crossword.length - (k + 1), 2) + Math.pow((t + 1), 2)) >= word.length() ? word.length() : 0;
                                down:
                                if (xLen < word.length())
                                {
                                    str = "";
                                    break down;
                                }
                                else
                                {
                                    downTo:
                                    for (int x = k, y = t; x < (k + word.length()); x++, y --)
                                    {
                                        if (x == (crossword.length - 1) || y == 0)
                                        {
                                            str = str + (char) (crossword[x][y]);
                                            finalX = y;
                                            finalY = x;
                                            break downTo;
                                        }
                                        str = str + (char) (crossword[x][y]);
                                        if (str.length() == word.length())
                                        {
                                            finalX = y;
                                            finalY = x;
                                            break downTo;
                                        }
                                    }
                                    if (word.equals(str))
                                    {
                                        System.out.println("Найдено слово влево вниз по диагонали: " + word);
                                        Word word1 = new Word(word);
                                        startY = k;
                                        startX = t;
                                        //finalY = k + word.length() - 1;
                                        // finalX = t;
                                        System.out.println("Кординаты: " + startX + "-" + startY + ":" + finalX + "-" + finalY);
                                        word1.setStartPoint(startX,startY);
                                        word1.setEndPoint(finalX,finalY);
                                        list.add(word1);
                                        ok = true;
                                        str = "";
                                        break downToDo;
                                    }
                                    str = "";
                                }
                            }
                        }
                    }
                }
            }
        }
        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);
        }
    }