Вопрос к постановщикам задачи:
4. Все слова есть в массиве. (из условия).
А тогда уточните:
Я должна найти 1 вхождение слова? или ВСЕ?
Потому что претензия к моему решению: Метод должен возвращать список всех слов...
Мой алгоритм ищет ВСЕ вхождения слова, т.е. если это вхождение не одно, то возвращаемый список у меня будет больше, чем заданный.
Варианта расположения слова, которое мой алгоритм не находит я придумать не смогла.
Может, кто подскажет, в чем тогда дело?
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, "home","same");
/*
Ожидаемый результат
home - (5, 3) - (2, 0)
same - (1, 1) - (4, 1)
*/
}
public static List<Word> detectAllWords(int[][] crossword, String... words) {
List<Word> w = new ArrayList<>();
int matL = crossword.length; //это число строк массива
int matV = crossword[0].length; // это число столбцов массива
for (int l = 0; l<words.length; l++
) {
String text = words[l];
int len = text.length();
int[] temp = new int[len-1];
for (int i = 0; i <matL ; i++) {
for (int j = 0; j <matV ; j++) {
//ищем первый символ
if(crossword[i][j]==text.charAt(0)){
int[] war = {0,0,0,0};
//перебираем варианты вектора
//проверка В0: вправо при фиксированном i j возрастает
if( (j+len-1) < matV){
war[0]=1;
//да, cтроим вектор для проверки и проверяем
for (int k = 1; k <len ; k++) {
temp[k-1] = crossword[i][j+k];
}
if (chekWord(text.substring(1),temp)){
Word ww = new Word(text);
ww.setStartPoint(j,i);
ww.setEndPoint(j+len-1,i);
w.add(ww);
}
}
// проверка В1: влево при фиксированном i j убывает
if ((j-len+1) >= 0){
war[1]=1;
//да, cтроим вектор для проверки и проверяем
for (int k = 1; k <len ; k++) {
temp[k - 1] = crossword[i][j - k];
}
if (chekWord(text.substring(1),temp)){
Word ww = new Word(text);
ww.setStartPoint(j,i);
ww.setEndPoint(j-len+1,i);
w.add(ww);
}
}
// проверка В2:вверх при фиксированном j, i убывает
if ((i-len+1)>=0){
war[2] = 1;
//да, cтроим вектор для проверки и проверяем
for (int k = 1; k <len ; k++) {
temp[k-1] = crossword[i-k][j];
}
if (chekWord(text.substring(1),temp)){
Word ww = new Word(text);
ww.setStartPoint(j,i);
ww.setEndPoint(j,i-len+1);
w.add(ww);
}
}
// проверка В3: вниз при фиксированном j i возрастает
if((i+len-1)<matL){
war[3]=1;
//да, cтроим вектор для проверки и проверяем
for (int k = 1; k <len ; k++) {
temp[k-1] = crossword[i+k][j];
}
if (chekWord(text.substring(1),temp)){
Word ww = new Word(text);
ww.setStartPoint(j,i);
ww.setEndPoint(j,i+len-1);
w.add(ww);
}
}
// проверка В4:диагональ вверх, вправо.i убывает, j возрастает
if (war[0]*war[2]==1){
//да, cтроим вектор для проверки и проверяем
for (int k = 1; k <len ; k++) {
temp[k-1] = crossword[i-k][j+k];
}
if (chekWord(text.substring(1),temp)){
Word ww = new Word(text);
ww.setStartPoint(j,i);
ww.setEndPoint(j+len-1,i-len+1);
w.add(ww);
}
}
// проверка В5: диагональ вниз, вправо. i возрастает, j возрастает
if (war[0]*war[3]==1){
//да, cтроим вектор для проверки и проверяем
for (int k = 1; k <len ; k++) {
temp[k-1] = crossword[i+k][j+k];
}
if (chekWord(text.substring(1),temp)){
Word ww = new Word(text);
ww.setStartPoint(j,i);
ww.setEndPoint(j+len-1,i+len-1);
w.add(ww);
}
}
// проверка В6: диагональ вверх, влево. i убывает, j убывает
if (war[1]*war[2]==1){
//да, cтроим вектор для проверки и проверяем
for (int k = 1; k <len ; k++) {
temp[k-1] = crossword[i-k][j-k];
}
if (chekWord(text.substring(1),temp)){
Word ww = new Word(text);
ww.setStartPoint(j,i);
ww.setEndPoint(j-len+1,i-len+1);
w.add(ww);
}
}
// проверка В7: диагональ вниз, влево. i возрастает, j убывает
if (war[1]*war[3]==1){
//да, cтроим вектор для проверки и проверяем
for (int k = 1; k <len ; k++) {
temp[k-1] = crossword[i+k][j-k];
}
if (chekWord(text.substring(1),temp)){
Word ww = new Word(text);
ww.setStartPoint(j,i);
ww.setEndPoint(j+len-1,i-len+1);
w.add(ww);
}
}
}
}
}
}
//for (Word t: w
// ) {
// System.out.println(t.toString());
//}
return w;
}
public static boolean chekWord (String text,int t[]){
for (int i = 0; i <t.length ; i++) {
if(t[i]!=text.charAt(i)){
return false;
}
}
return true;
}
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);
}
}
}