В 100500 раз одна и та же тема тут, но всё же. Ни разу не задавал тут вопроса, но эта задача поставила в ступор просто. Я прошелся по всем возможным предложенным тут спискам и проверкам. Все они выдают правильный вариант. И 22 штуки sos искал, и one и еще очень много разных массивов и слов. Но валя походу на своей волне, а я на неё никак не попаду. Очень прошу помощи. Можно было бы конечно забить и пропустить её, но это уже дело принципа ))
package com.javarush.task.task20.task2027;
import java.lang.reflect.Array;
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");
/* List<Word> list = new ArrayList<>();
list = detectAllWords(crossword, "home", "same");
for (Word word: list){
System.out.println(word.toString());
}
/*
Ожидаемый результат
home - (5, 3) - (2, 0)
same - (1, 1) - (4, 1)
*/
}
public static List<Word> detectAllWords(int[][] crossword, String... words) {
List<Word> words1 = new ArrayList<>();
for (String word: words){
// String result="";
for (int i=0; i<crossword.length; i++){
for (int j=0; j<crossword[i].length; j++){
if (crossword[i][j]==word.charAt(0)){
//result+=word+" - ("+j+", "+i+") - (";
List<int[]> vectors = new ArrayList<>();
vectors = detectVector(crossword, word.charAt(1), i, j);
if (vectors!=null){
for (int[] vector: vectors) {
int[] last = findLast(crossword, word.charAt(word.length() - 1), i, j, vector, word);
if (last!=null) {
Word w = new Word(word);
w.setStartPoint(j, i);
w.setEndPoint(last[0], last[1]);
words1.add(w);
}
}
}
//result+=last[0]+", "+last[1]+")";
}
}
}
//System.out.println(result);
}
return words1;
}
public static List<int[]> detectVector(int[][] crossword, char c, int first, int sec){
List<int[]> list = new ArrayList<>();
for (int i=first-1; i<=first+1; i++){
for (int j=sec-1; j<=sec+1; j++){
if ((i<crossword.length)&&(i>=0)){
if ((j<crossword[i].length)&&(j>=0)){
if (crossword[i][j]==c) {
int[] result = new int[2];
result[0] = j;
result[1] = i;
list.add(result);
}
}
}
}
}
if (list.isEmpty())
return null;
else
return list;
}
public static int[] findLast(int[][] crossword, char c, int first, int sec, int[] vector, String word){
int i=first;
int j=sec;
Boolean flag=false;
for (int n=0; n<word.length(); n++){
if (crossword[i][j]==word.charAt(n)){
if (n==word.length()-1)
flag = true;
else {
i += vector[1] - first;
j += vector[0] - sec;
if ((i>=crossword.length)||(j>=crossword[i].length))
return null;
}
}
}
int[] result = new int[2];
if (flag) {
result[0] = j;
result[1] = i;
}else {
result = null;
}
return result;
}
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);
}
}
}