Я не нашел в инете как решить эту задачу просто и быстро, поэтому пытаюсь решить ее самым тупым способом.
И оно даже все слова находит (по горизонтали, вертикали.... как угодно расположенные).
валидатор говорит: "Ты неправильно определил положение граничных букв(ы) слов(а)." ну всеж правильно...
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);
}
}
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, "kerpo","jrrad","fsgrj","lle","grj","moh","mo","plgml","erv","oo","ud","mnar","lse","ud","eag","hj","re","fulmp","dsn","pml","vok","mluf","gae","edf","masu","vor","jje","rlk","poee","same","mlp","home");
/*
Ожидаемый результат
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;
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);
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);
word1.setStartPoint(k,t);
word1.setEndPoint(k,t - word.length());
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);
word1.setStartPoint(k,t);
word1.setEndPoint(k - word.length(),t);
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);
word1.setStartPoint(k,t);
word1.setEndPoint(k + word.length(),t);
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);
word1.setStartPoint(k,t);
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);
word1.setStartPoint(k,t);
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);
word1.setStartPoint(k,t);
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);
word1.setStartPoint(k,t);
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);
}
}
}