h
e
e
e
e
e
e
e
l
p
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', 'e', 'r'},
{'u', 's', 'a', 'm', 'e', 'r'},
{'l', 'n', 'g', 'r', 'o', 'v'},
{'m', 'l', 'p', 'r', 'r', 'h'},
{'p', 'o', 'e', 'e', 'j', 'j'}
};
List<Word> words = detectAllWords(crossword, "home", "same", "oln", "re");
for (Word w :
words) {
System.out.println(w);
}
System.out.println(words.size());
}
public static void findWord(int ipos, int jpos, int[][] crossword, String words, ArrayList<Word> list) {
//gorizont
String s = "";
for (int j = jpos; j < crossword[0].length && j < jpos + words.length(); j++) {
s += (char) crossword[ipos][j];
}
if (s.equals(words)) {
Add(list, jpos, ipos, jpos + words.length() - 1, ipos, words);
}
s = "";
for (int j = jpos; j >= 0 && j > jpos - words.length(); j--) {
s += (char) crossword[ipos][j];
}
if (s.equals(words)) {
Add(list, jpos, ipos, jpos - words.length() + 1, ipos, words);
}
s = "";
//vertikalka
for (int i = ipos; i < crossword.length; i++) {
s += (char) crossword[i][jpos];
}
if (s.equals(words)) {
Add(list, jpos, ipos, jpos, ipos + words.length() - 1, words);
}
s = "";
for (int i = ipos; i >= 0 && i > ipos - words.length(); i--) {
s += (char) crossword[i][jpos];
}
if (s.equals(words)) {
Add(list, jpos, ipos, jpos, ipos - words.length() + 1, words);
}
s = "";
for (int i = ipos, j = jpos; i >= 0 && i > ipos - words.length() && j < crossword[0].length && j < jpos + words.length(); j++, i--) {
s += (char) crossword[i][j];
}
if (s.equals(words)) {
Add(list, jpos, ipos, jpos + words.length() - 1, ipos - words.length() + 1, words);
}
s = "";
for (int i = ipos, j = jpos; j >= 0 && j > jpos - words.length() && i < crossword.length && i < ipos + words.length(); i++, j--) {
s += (char) crossword[i][j];
}
if (s.equals(words)) {
Add(list, jpos, ipos, jpos - words.length() + 1, ipos + words.length() - 1, words);
}
s = "";
for (int i = ipos, j = jpos; i < crossword.length && i < ipos + words.length() && j < crossword[0].length && j < jpos + words.length(); j++, i++) {
s += (char) crossword[i][j];
}
if (s.equals(words)) {
Add(list, jpos, ipos, jpos + words.length() - 1, ipos + words.length() - 1, words);
}
s = "";
for (int i = ipos, j = jpos; i >= 0 && i > ipos - words.length() && j >= 0 && j > jpos - words.length(); j--, i--) {
s += (char) crossword[i][j];
}
if (s.equals(words)) {
Add(list, jpos, ipos, jpos - words.length() + 1, ipos - words.length() + 1, words);
}
s = "";
}
public static void Add(ArrayList<Word> list, int startX, int startY, int endX, int endY, String words) {
Word word = new Word(words);
word.setStartPoint(startX, startY);
word.setEndPoint(endX, endY);
list.add(word);
}
public static List<Word> detectAllWords(int[][] crossword, String... words) {
ArrayList<Word> list = new ArrayList<>();
for (int s = 0; s < words.length; s++) {
char[] chars = words[s].toCharArray();
for (int i = 0; i < crossword.length; i++) {
for (int j = 0; j < crossword[0].length; j++) {
if ((char) crossword[i][j] == chars[0]) {
findWord(i, j, crossword, words[s], list);
}
}
}
}
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);
}
}
}