Прошу даже не подсказки по решению, а пример тест-кейса, который моя программа не проходит.
То, что код неоптимальный и запутанный, я знаю, принципиально решал сам без подсказок.
Вот такие тесты корректно отрабатывает (дефолтный из задачи, разумеется, тоже):
поиск "home" в двух вариантах
int[][] crossword = new int[][]{
{'f', 'd', 'e', 'r', 'l', 'k'},
{'u', 's', 'a', 'm', 'e', 'o'},
{'l', 'n', 'g', 'r', 'o', 'v'},
{'m', 'l', 'e', 'm', 'o', 'h'},
{'p', 'o', 'e', 'e', 'j', 'j'}
};
Результат:
home - (5, 3) - (2, 0)
home - (5, 3) - (2, 3)
same - (1, 1) - (4, 1)
поиск 8 вариантов "one"
int[][] crossword = new int[][]{
{'f', 'e', 'e', 'e', 'l', 'e'},
{'u', 's', 'n', 'n', 'n', 'o'},
{'l', 'e', 'n', 'o', 'n', 'e'},
{'m', 'm', 'n', 'n', 'n', 'h'},
{'p', 'e', 'e', 'e', 'j', 'e'},
};
Результат:
one - (3, 2) - (1, 0)
one - (3, 2) - (3, 0)
one - (3, 2) - (5, 0)
one - (3, 2) - (1, 2)
one - (3, 2) - (5, 2)
one - (3, 2) - (1, 4)
one - (3, 2) - (3, 4)
one - (3, 2) - (5, 4)
поиск pmlpml
int[][] crossword = new int[][]{
{'f', 'd', 'e', 'r', 'l', 'k', 'd', 'e', 'r', 'l', 'k'},
{'u', 's', 'a', 'm', 'e', 'o', 's', 'a', 'm', 'e', 'o'},
{'l', 'n', 'g', 'r', 'o', 'v', 'n', 'g', 'r', 'o', 'v'},
{'m', 'l', 'p', 'r', 'r', 'h', 'l', 'p', 'r', 'r', 'h'},
{'p', 'o', 'e', 'e', 'j', 'j', 'o', 'e', 'e', 'j', 'j'},
{'l', 'n', 'g', 'r', 'o', 'v', 'n', 'g', 'r', 'o', 'v'},
{'m', 'l', 'p', 'r', 'r', 'h', 'l', 'p', 'r', 'r', 'h'},
{'p', 'o', 'e', 'e', 'j', 'j', 'o', 'e', 'e', 'j', 'j'}
};
Результат:
pmlpml - (0, 7) - (0, 2)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> allWords = new ArrayList<>();
for (String w : words) {
ArrayList<Symbol> symbList = new ArrayList<>();
char[] symbols = w.toCharArray();
for (int c = 0; c < symbols.length; c++) {
for (int i = 0; i < crossword.length; i++) {
for (int q = 0; q < crossword[i].length; q++) {
if (crossword[i][q] == (int) symbols[c]) {
symbList.add(new Symbol((int) symbols[c], i, q, c));
}
}
}
}
for (Symbol symbol : symbList) {
if (symbol.numberInWord == 0) {
for (Symbol symbol2 : symbList) {
if (symbol2.numberInWord == 1 && symbol2.xCount >= symbol.xCount - 1 && symbol2.xCount <= symbol.xCount + 1 &&
symbol2.yCount >= symbol.yCount - 1 && symbol2.yCount <= symbol.yCount + 1) {
ArrayList<Symbol> word = new ArrayList<>();
word.add(symbol);
word.add(symbol2);
int countLetter = 2;
if (symbol2.xCount < symbol.xCount && symbol2.yCount == symbol.yCount) { // проверяем север
for (Symbol symbol3 : symbList) {
if (symbol3.numberInWord == countLetter && symbol3.xCount == word.get(countLetter - 1).xCount - 1 &&
symbol3.yCount == word.get(countLetter - 1).yCount) {
word.add(symbol3);
countLetter++;
}
}
}
if (symbol2.xCount > symbol.xCount && symbol2.yCount == symbol.yCount) { // проверяем юг
for (Symbol symbol3 : symbList) {
if (symbol3.numberInWord == countLetter && symbol3.xCount == word.get(countLetter - 1).xCount + 1 &&
symbol3.yCount == word.get(countLetter - 1).yCount) {
word.add(symbol3);
countLetter++;
}
}
}
if (symbol2.xCount == symbol.xCount && symbol2.yCount < symbol.yCount) { // проверяем запад
for (Symbol symbol3 : symbList) {
if (symbol3.numberInWord == countLetter && symbol3.xCount == word.get(countLetter - 1).xCount &&
symbol3.yCount == word.get(countLetter - 1).yCount - 1) {
word.add(symbol3);
countLetter++;
}
}
}
if (symbol2.xCount == symbol.xCount && symbol2.yCount > symbol.yCount) { // проверяем восток
for (Symbol symbol3 : symbList) {
if (symbol3.numberInWord == countLetter && symbol3.xCount == word.get(countLetter - 1).xCount &&
symbol3.yCount == word.get(countLetter - 1).yCount + 1) {
word.add(symbol3);
countLetter++;
}
}
}
if (symbol2.xCount < symbol.xCount && symbol2.yCount > symbol.yCount) { // проверяем северо-восток
for (Symbol symbol3 : symbList) {
if (symbol3.numberInWord == countLetter && symbol3.xCount == word.get(countLetter - 1).xCount - 1 &&
symbol3.yCount == word.get(countLetter - 1).yCount + 1) {
word.add(symbol3);
countLetter++;
}
}
}
if (symbol2.xCount < symbol.xCount && symbol2.yCount < symbol.yCount) { // проверяем северо-запад
for (Symbol symbol3 : symbList) {
if (symbol3.numberInWord == countLetter && symbol3.xCount == word.get(countLetter - 1).xCount - 1 &&
symbol3.yCount == word.get(countLetter - 1).yCount - 1) {
word.add(symbol3);
countLetter++;
}
}
}
if (symbol2.xCount > symbol.xCount && symbol2.yCount < symbol.yCount) { // проверяем юго-запад
for (Symbol symbol3 : symbList) {
if (symbol3.numberInWord == countLetter && symbol3.xCount == word.get(countLetter - 1).xCount + 1 &&
symbol3.yCount == word.get(countLetter - 1).yCount - 1) {
word.add(symbol3);
countLetter++;
}
}
}
if (symbol2.xCount > symbol.xCount && symbol2.yCount > symbol.yCount) { // проверяем юго-восток
for (Symbol symbol3 : symbList) {
if (symbol3.numberInWord == countLetter && symbol3.xCount == symbol2.xCount + 1 &&
symbol3.yCount == symbol2.yCount + 1) {
word.add(symbol3);
countLetter++;
}
}
}
StringBuilder builder = new StringBuilder();
for (Symbol s : word) {
builder.append((char) s.unicode);
}
String text = builder.toString();
//System.out.println(text);
for (String myword : words) {
if (myword.equals(text)) {
Word newWord = new Word(text);
newWord.startX = word.get(0).yCount;
newWord.startY = word.get(0).xCount;
newWord.endX = word.get(word.size() - 1).yCount;
newWord.endY = word.get(word.size() - 1).xCount;
allWords.add(newWord);
}
}
}
}
}
}
}
//for (Word word : allWords) {
// System.out.println(word);
//}
return allWords;
}
public static class Symbol {
private int unicode;
private int xCount;
private int yCount;
private int numberInWord;
public Symbol(int unicode, int xCount, int yCount, int numberInWord) {
this.unicode = unicode;
this.xCount = xCount;
this.yCount = yCount;
this.numberInWord = numberInWord;
}
public int getxCount() {
return this.xCount;
}
public int getyCount() {
return this.yCount;
}
@Override
public String toString() {
return String.format("%d - %d, %d - %d", unicode, xCount, yCount, numberInWord);
}
}
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);
}
}
}
/*
for (Symbol symbol : symbList) {
ArrayList<Symbol> word = new ArrayList<>();
if (symbol.numberInWord == 0) {
word.add(symbol);
for (Symbol symbol2 : symbList) {
if (symbol2.numberInWord == 1 && symbol2.xCount >= symbol.xCount - 1 && symbol2.xCount <= symbol.xCount + 1 &&
symbol2.yCount >= symbol.yCount - 1 && symbol2.yCount <= symbol.yCount + 1) {
word.add(symbol2);
int countLetter = 2;
if (symbol2.xCount < symbol.xCount && symbol2.yCount == symbol.yCount) { // проверяем север
for (Symbol symbol3 : symbList) {
if (symbol3.numberInWord == countLetter && symbol3.xCount == word.get(countLetter - 1).xCount - 1 &&
symbol3.yCount == word.get(countLetter - 1).yCount) {
word.add(symbol3);
countLetter++;
}
}
}
if (symbol2.xCount > symbol.xCount && symbol2.yCount == symbol.yCount) { // проверяем юг
for (Symbol symbol3 : symbList) {
if (symbol3.numberInWord == countLetter && symbol3.xCount == word.get(countLetter - 1).xCount + 1 &&
symbol3.yCount == word.get(countLetter - 1).yCount) {
word.add(symbol3);
countLetter++;
}
}
}
if (symbol2.xCount == symbol.xCount && symbol2.yCount < symbol.yCount) { // проверяем запад
for (Symbol symbol3 : symbList) {
if (symbol3.numberInWord == countLetter && symbol3.xCount == word.get(countLetter - 1).xCount &&
symbol3.yCount == word.get(countLetter - 1).yCount - 1) {
word.add(symbol3);
countLetter++;
}
}
}
if (symbol2.xCount == symbol.xCount && symbol2.yCount > symbol.yCount) { // проверяем восток
for (Symbol symbol3 : symbList) {
if (symbol3.numberInWord == countLetter && symbol3.xCount == word.get(countLetter - 1).xCount &&
symbol3.yCount == word.get(countLetter - 1).yCount + 1) {
word.add(symbol3);
countLetter++;
}
}
}
if (symbol2.xCount < symbol.xCount && symbol2.yCount > symbol.yCount) { // проверяем северо-восток
for (Symbol symbol3 : symbList) {
if (symbol3.numberInWord == countLetter && symbol3.xCount == word.get(countLetter - 1).xCount - 1 &&
symbol3.yCount == word.get(countLetter - 1).yCount + 1) {
word.add(symbol3);
countLetter++;
}
}
}
if (symbol2.xCount < symbol.xCount && symbol2.yCount < symbol.yCount) { // проверяем северо-запад
for (Symbol symbol3 : symbList) {
if (symbol3.numberInWord == countLetter && symbol3.xCount == word.get(countLetter - 1).xCount - 1 &&
symbol3.yCount == word.get(countLetter - 1).yCount - 1) {
word.add(symbol3);
countLetter++;
}
}
}
if (symbol2.xCount > symbol.xCount && symbol2.yCount < symbol.yCount) { // проверяем юго-запад
for (Symbol symbol3 : symbList) {
if (symbol3.numberInWord == countLetter && symbol3.xCount == word.get(countLetter - 1).xCount + 1 &&
symbol3.yCount == word.get(countLetter - 1).yCount - 1) {
word.add(symbol3);
countLetter++;
}
}
}
if (symbol2.xCount > symbol.xCount && symbol2.yCount > symbol.yCount) { // проверяем юго-восток
for (Symbol symbol3 : symbList) {
if (symbol3.numberInWord == countLetter && symbol3.xCount == symbol2.xCount + 1 &&
symbol3.yCount == symbol2.yCount + 1) {
word.add(symbol3);
countLetter++;
}
}
}
}
}
StringBuilder builder = new StringBuilder();
for (Symbol s : word) {
builder.append((char) s.unicode);
}
String text = builder.toString();
System.out.println(text);
for (String myword : words) {
if (myword.equals(text)) {
Word newWord = new Word(text);
newWord.startX = word.get(0).yCount;
newWord.startY = word.get(0).xCount;
newWord.endX = word.get(word.size() - 1).yCount;
newWord.endY = word.get(word.size() - 1).xCount;
allWords.add(newWord);
}
}
}
}
}
int[][] crossword = new int[][]{
{'f', 'd', 'e', 'r', 'l', 'k'},
{'u', 's', 'a', 'm', 'e', 'o'},
{'l', 'a', 'g', 'r', 'o', 'v'},
{'m', 'm', 'e', 'm', 'o', 'h'},
{'p', 'e', 'e', 'e', 'j', 'j'}
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'}
};
int[][] crossword = new int[][]{
{'f', 'd', 'e', 'r', 'l', 'k', 'd', 'e', 'r', 'l', 'k'},
{'u', 's', 'a', 'm', 'e', 'o', 's', 'a', 'm', 'e', 'o'},
{'l', 'n', 'g', 'r', 'o', 'v', 'n', 'g', 'r', 'o', 'v'},
{'m', 'l', 'p', 'r', 'r', 'h', 'l', 'p', 'r', 'r', 'h'},
{'p', 'o', 'e', 'e', 'j', 'j', 'o', 'e', 'e', 'j', 'j'},
{'l', 'n', 'g', 'r', 'o', 'v', 'n', 'g', 'r', 'o', 'v'},
{'m', 'l', 'p', 'r', 'r', 'h', 'l', 'p', 'r', 'r', 'h'},
{'p', 'o', 'e', 'e', 'j', 'j', 'o', 'e', 'e', 'j', 'j'}
};
*/