Задачу можно трактовать по разному, а именно фраза "должен найти"
Под этим подразумевается "жадный", или "нежадный" поиск? То есть должно найти одно вхождение, или все?
Опять же "зеркальные слова" как должны находиться?
Метод detectAllWords должен найти все слова из words в массиве crossword.
UPD: Опять же объем поиска непонятен, каков размер матрицы? Тонкое место у меня в коде, так как я поставил всегд 10 возможных вхождений слова, сейчас переделаю... :))) Но все же.
UPD: Переписал searchSymbol
public static int[][] searchSymbol(int symbol, int[][] cross){
int count = 0;
for (int[] ints : cross) {
for (int anInt : ints) {
if (anInt == symbol) {
count++;
}
}
}
int[][] rez = new int[count + 1][2];
count = 0;
for(int i = 0; i < cross.length; i++){
for(int j = 0 ; j < cross[i].length; j++){
if(cross[i][j] == symbol) {
rez[count][0] = i;
rez[count][1] = j;
count++;
}
}
}
rez[count][0] = -1;
rez[count][1] = -1;
return rez;
}package com.javarush.task.task20.task2027;
import java.util.ArrayList;
import java.util.Arrays;
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'}
};
List<Word> li;
li =
detectAllWords(crossword, "home", "same");
for(Word s: li){
System.out.println(s);
}
/*
Ожидаемый результат
home - (5, 3) - (2, 0)
same - (1, 1) - (4, 1)
*/
}
public static List<Word> detectAllWords(int[][] crossword, String... words) {
List<Word> list = new ArrayList<>();
for(String s : words){
list.add(new Word(s));
}
List<Word> listTrue = new ArrayList<>(list);
for(Word word : list) {
int z = 0; // символ в слове
int[][] startSymbol = searchSymbol(word.text.charAt(z),crossword);
z++;
int i = 0;
int j = 0;
int k = 0;
boolean count = false;
int zzz = listTrue.indexOf(word);
while(startSymbol[k][0] != -1) {
for(i = Math.max((startSymbol[k][0] - 1), 0); i < Math.min((startSymbol[k][0] + 2),crossword.length);i++){
for(j = Math.max((startSymbol[k][1] - 1), 0); j < Math.min((startSymbol[k][1] + 2),crossword[0].length);j++){
if (startSymbol[k][0] == i && startSymbol[k][1] == j) continue;
if(crossword[i][j] == word.text.charAt(z)){
int[] rez = checkWord(crossword,i,j,startSymbol[k][0],startSymbol[k][1],word.text);
if(rez[0] != -1 && !count) {
listTrue.get(zzz).setStartPoint(startSymbol[k][1], startSymbol[k][0]);
listTrue.get(zzz).setEndPoint(rez[1],rez[0]);
count = true;
} else if(rez[0] != -1) {
Word addCopyWord = new Word(word.text);
addCopyWord.setStartPoint(startSymbol[k][1], startSymbol[k][0]);
addCopyWord.setEndPoint(rez[1],rez[0]);
listTrue.add(addCopyWord);
}
}
}
}
k++;
}
}
return listTrue;
}
private static int[] checkWord(int[][] crossword, int i, int j, int startI,int startJ, String word) {
if(word.length() == 2){
return new int[]{i,j};
}
int z = 0;
int iNext = -1;
int jNext = -1;
while(word.length() > z + 2) {
if (startI == i && startJ < j) {jNext = j + 1 + z; iNext = i;}// V-
if (startI == i && startJ > j) {jNext = j - 1 - z; iNext = i;} //-V
if (startJ == j && startI < i) {iNext = i + 1 + z; jNext = j;} // H-
if (startJ == j && startI > i) {iNext = i - 1 - z; jNext = j;} //-H
if (startI > i && startJ > j) {
iNext = i - 1 - z;
jNext = j - 1 - z;
}
if (startI > i && startJ < j) {
iNext = i - 1 - z;
jNext = j + 1 + z;
}
if (startI < i && startJ > j) {
iNext = i + 1 + z;
jNext = j - 1 - z;
}
if (startI < i && startJ < j) {
iNext = i + 1 + z;
jNext = j + 1 + z;
}
if (word.charAt(z + 2) != crossword[iNext][jNext]) return new int[]{-1,-1};
z++;
}
return new int[]{iNext,jNext};
}
public static int[][] searchSymbol(int symbol, int[][] cross){
int[][] rez = {
{-1, -1},{-1, -1},{-1, -1},{-1, -1},{-1, -1},
{-1, -1},{-1, -1},{-1, -1},{-1, -1},{-1, -1}
};
int count = 0;
for(int i = 0; i < cross.length; i++){
for(int j = 0 ; j < cross[i].length; j++){
if(cross[i][j] == symbol) {
rez[count][0] = i;
rez[count][1] = j;
count++;
}
}
}
return rez;
}
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);
}
}
}