МОЙ ВАРИАНТ:
package com.javarush.test.level20.lesson10.bonus03;
import java.util.ArrayList;
import java.util.List;
/* Кроссворд
1. Дан двумерный массив, который содержит буквы английского алфавита в нижнем регистре.
2. Метод detectAllWords должен найти все слова из words в массиве crossword.
3. Элемент(startX, startY) должен соответствовать первой букве слова, элемент(endX, endY) - последней.
text - это само слово, располагается между начальным и конечным элементами
4. Все слова есть в массиве.
5. Слова могут быть расположены горизонтально, вертикально и по диагонали как в нормальном, так и в обратном порядке.
6. Метод main не участвует в тестировании
*/
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> list = detectAllWords(crossword, "home", "same", "unpe", "vorgnl", "ker");
for (Word word : list) System.out.println(word);
/*
Ожидаемый результат
home - (5, 3) - (2, 0)
same - (1, 1) - (4, 1)
*/
}
/**
* Порядок исполнения программы.
*
* 1. Берём слово.
* 2. Раскладываем на символы.
* 3. Прогоняем каждый символ через матрицу.
* 4. Находим первую букву.
* 5. Находим последнюю букву.
* 6. Проверяем все буквы между ними.
* 6.1. Вычисляем разницу между координатами.
* 6.2. Создаём циклы по разнице.
* 6.2.1. знак числа узнаём через метод с return 1 или -1.
* 6.3. Или разница сокращается одинаковыми шагами цикла, или вообще не сокращается по одному из направлений.
* 7. Если буквы совпадают, фиксируем первый и последний символы.
* 8. Добавляем объект в список.
*/
public static List<Word> detectAllWords(int[][] crossword, String... words) {
List<Word> list = new ArrayList<>();
for (String word : words) {
char[] chars = word.toCharArray();
int[] coordinates = detectCoordinates(crossword, chars);
Word word1 = new Word(word);
word1.setStartPoint(coordinates[0], coordinates[1]);
word1.setEndPoint(coordinates[2], coordinates[3]);
list.add(word1);
System.out.println("---------");
}
return list;
}
private static int[] detectCoordinates(int[][] crossword, char[] chars) {
int[] coordinates = new int[4];
for (int i = 0; i < crossword.length; i++) {
for (int j = 0; j < crossword[i].length; j++) {
if (crossword[i][j] == chars[0]) {
coordinates[1] = i;
coordinates[0] = j;
System.out.printf("detectCoordinates 1: %d - %d%n", coordinates[1], coordinates[0]);
int[] finish = detectLastChar(crossword, chars, i, j);
coordinates[2] = finish[0];
coordinates[3] = finish[1];
System.out.printf("detectCoordinates 2: %d - %d%n", coordinates[2], coordinates[3]);
}
}
}
return coordinates;
}
private static int[] detectLastChar(int[][] crossword, char[] chars, int y1, int x1) {
int[] finalCoordinates = new int[2];
for (int i = 0; i < crossword.length; i++) {
for (int j = 0; j < crossword[i].length; j++) {
if (crossword[i][j] == chars[chars.length - 1]) {
if (validate(crossword, chars, y1, x1, i, j)) {
finalCoordinates[0] = j;
finalCoordinates[1] = i;
return finalCoordinates;
}
}
}
}
return finalCoordinates;
}
private static boolean validate(int[][] crossword,
char[] chars,
int y1, int x1, int y2, int x2) {
int xSign = detectSign(x1, x2);
int ySign = detectSign(y1, y2);
System.out.println("x: " + xSign);
System.out.println("y: " + ySign);
int counter = 0;
System.out.printf("validate: (%d - %d) - (%d - %d)%n", y1, x1, y2, x2);
while(++counter < chars.length) {
y1 += ySign;
x1 += xSign;
System.out.printf("subvalidate: (%d - %d) - (%d - %d), ", y1, x1, y2, x2);
System.out.printf("crossword: %c, char: %c - ", crossword[y1][x1], chars[counter]);
if (crossword[y1][x1] != chars[counter]) {
System.out.println("false");
return false;
}
System.out.println("true");
}
return true;
}
private static int detectSign(int i, int j) {
if (i > j) return -1;
else if (i < j) return 1;
else return 0;
}
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);
}
}
}
МОЙ ВАРИАНТ 2, ПЕРЕПИСАЛ В ОДИН МЕТОД:
package com.javarush.test.level20.lesson10.bonus03;
import java.util.ArrayList;
import java.util.List;
/* Кроссворд
1. Дан двумерный массив, который содержит буквы английского алфавита в нижнем регистре.
2. Метод detectAllWords должен найти все слова из words в массиве crossword.
3. Элемент(startX, startY) должен соответствовать первой букве слова, элемент(endX, endY) - последней.
text - это само слово, располагается между начальным и конечным элементами
4. Все слова есть в массиве.
5. Слова могут быть расположены горизонтально, вертикально и по диагонали как в нормальном, так и в обратном порядке.
6. Метод main не участвует в тестировании
*/
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> list = detectAllWords(crossword, "home", "same");
for (Word word : list) System.out.println(word);
/*
Ожидаемый результат
home - (5, 3) - (2, 0)
same - (1, 1) - (4, 1)
*/
}
/**
* Порядок исполнения программы.
*
* 1. Берём слово.
* 2. Раскладываем на символы.
* 3. Прогоняем каждый символ через матрицу.
* 4. Находим первую букву.
* 5. Находим последнюю букву.
* 6. Проверяем все буквы между ними.
* 6.1. Вычисляем разницу между координатами.
* 6.2. Создаём циклы по разнице.
* 6.2.1. знак числа узнаём через метод с return 1 или -1.
* 6.3. Или разница сокращается одинаковыми шагами цикла, или вообще не сокращается по одному из направлений.
* 7. Если буквы совпадают, фиксируем первый и последний символы.
* 8. Добавляем объект в список.
*/
public static List<Word> detectAllWords(int[][] crossword, String... words) {
List<Word> list = new ArrayList<>();
for (String word : words) {
char[] chars = word.toCharArray();
int[] coordinates1 = new int[4];
for (int y1 = 0; y1 < crossword.length; y1++) {
for (int x1 = 0; x1 < crossword[y1].length; x1++) {
if (crossword[y1][x1] == chars[0]) {
coordinates1[1] = y1;
coordinates1[0] = x1;
int[] finish1 = new int[2];
boolean isChecked = false;
for (int k = 0; k < crossword.length; k++) {
for (int l = 0; l < crossword[k].length; l++) {
if (crossword[k][l] == chars[chars.length - 1] && !isChecked) {
int result1;
if (x1 > l) result1 = -1;
else if (x1 < l) result1 = 1;
else result1 = 0;
int xSign = result1;
int result;
if (y1 > k) result = -1;
else if (y1 < k) result = 1;
else result = 0;
int ySign = result;
int thisX = x1;
int thisY = y1;
int counter = 0;
while(++counter < chars.length) {
thisY += ySign;
thisX += xSign;
if (crossword[thisY][thisX] != chars[counter]) {
break;
}
}
if (counter == chars.length) {
isChecked = true;
finish1[0] = l;
finish1[1] = k;
}
}
}
}
coordinates1[2] = finish1[0];
coordinates1[3] = finish1[1];
}
}
}
Word word1 = new Word(word);
word1.setStartPoint(coordinates1[0], coordinates1[1]);
word1.setEndPoint(coordinates1[2], coordinates1[3]);
list.add(word1);
}
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.test.level20.lesson10.bonus03;
import java.util.ArrayList;
import java.util.List;
/* Кроссворд
1. Дан двумерный массив, который содержит буквы английского алфавита в нижнем регистре.
2. Метод detectAllWords должен найти все слова из words в массиве crossword.
3. Элемент(startX, startY) должен соответствовать первой букве слова, элемент(endX, endY) - последней.
text - это само слово, располагается между начальным и конечным элементами
4. Все слова есть в массиве.
5. Слова могут быть расположены горизонтально, вертикально и по диагонали как в нормальном, так и в обратном порядке.
6. Метод main не участвует в тестировании
*/
public class Solution {
public static void main(String[] args) {
List<Word> list = new ArrayList<Word>();
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 = detectAllWords(crossword, "emoh", "home", null, "", "same", "emas", "fderlk", "klredf", "fulmp", "poeejj", "jjeeop", "pmluf", "kovhj", "jhvok", "lprr", "rrpl", "lprr", "o", "", null, "test", "eo", "oe");
for (Word s : list) {
System.out.println(s.toString());
}
/*
Ожидаемый результат
home - (5, 3) - (2, 0)
same - (1, 1) - (4, 1)
*/
}
public static List<Word> detectAllWords(int[][] crossword, String... words) {
boolean textFineshed = false;
List<Word> list = new ArrayList<Word>();
for (String findWords : words) {
if (findWords == null || findWords == "") continue;
textFineshed = false;
int xStart = 0,
yStart = 0,
xEnd = 0,
yEnd = 0;
boolean isFirstSimbol, isText = false,
up = true, down = true, left = true, right = true,
leftUp = true, leftDown = true, rightUp = true, rightDown = true;
char[] simbolWords = findWords.toLowerCase().toCharArray();
isFirstSimbol = false;
for (int x = 0; x < crossword.length; x++) {
for (int y = 0; y < crossword[x].length; y++) {
if ((char) crossword[x][y] == simbolWords[0]) isFirstSimbol = true;
if (isFirstSimbol) {
xStart = x;
yStart = y;
for (int i = 0; i < simbolWords.length; i++) {
if (up) {
try {
up = (char) crossword[x - i][y] == simbolWords[i];
xEnd = x - i;
yEnd = y;
if (up && i + 1 == simbolWords.length) {
isText = true;
down = left = right = leftDown = leftUp = rightUp = rightDown = false;
}
} catch (ArrayIndexOutOfBoundsException e) {
up = false;
}
}
if (down) {
try {
down = (char) crossword[x + i][y] == simbolWords[i];
xEnd = x + i;
yEnd = y;
if (down && i + 1 == simbolWords.length) {
isText = true;
left = right = leftDown = leftUp = rightUp = rightDown = false;
}
} catch (ArrayIndexOutOfBoundsException e) {
down = false;
}
}
if (left) {
try {
left = (char) crossword[x][y - i] == simbolWords[i];
xEnd = x;
yEnd = y - i;
if (left && i + 1 == simbolWords.length) {
isText = true;
right = leftDown = leftUp = rightUp = rightDown = false;
}
} catch (ArrayIndexOutOfBoundsException e) {
left = false;
}
}
if (right) {
try {
right = (char) crossword[x][y + i] == simbolWords[i];
xEnd = x;
yEnd = y + i;
if (right && i + 1 == simbolWords.length) {
isText = true;
leftDown = leftUp = rightUp = rightDown = false;
}
} catch (ArrayIndexOutOfBoundsException e) {
right = false;
}
}
if (leftUp) {
try {
leftUp = (char) crossword[x - i][y - i] == simbolWords[i];
xEnd = x - i;
yEnd = y - i;
if (leftUp && i + 1 == simbolWords.length) {
isText = true;
leftDown = rightUp = rightDown = false;
}
} catch (ArrayIndexOutOfBoundsException e) {
leftUp = false;
}
}
if (leftDown) {
try {
leftDown = (char) crossword[x + i][y - i] == simbolWords[i];
xEnd = x + i;
yEnd = y - i;
if (leftDown && i + 1 == simbolWords.length) {
isText = true;
rightUp = rightDown = false;
}
} catch (ArrayIndexOutOfBoundsException e) {
leftDown = false;
}
}
if (rightUp) {
try {
rightUp = (char) crossword[x - i][y + i] == simbolWords[i];
xEnd = x - i;
yEnd = y + i;
if (rightUp && i + 1 == simbolWords.length) {
isText = true;
rightDown = false;
}
} catch (ArrayIndexOutOfBoundsException e) {
rightUp = false;
}
}
if (rightDown) {
try {
rightDown = (char) crossword[x + i][y + i] == simbolWords[i];
xEnd = x + i;
yEnd = y + i;
if (rightDown && i + 1 == simbolWords.length) isText = true;
} catch (ArrayIndexOutOfBoundsException e) {
rightDown = false;
}
}
if (isText) {
Word word = new Word(findWords);
word.setStartPoint(yStart, xStart);
word.setEndPoint(yEnd, xEnd);
list.add(word);
textFineshed = true;
}
if (textFineshed) break;
if (!(up || down || right || left || leftUp || leftDown || rightUp || rightDown)) {
isFirstSimbol = false;
up = down = left = right = leftDown = leftUp = rightUp = rightDown = true;
break;
}
}
if (textFineshed) break;
}
if (textFineshed) break;
}
if (textFineshed) break;
}
}
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);
}
}
}
Leave A Comment