Это филворд? т.е. слова могут быть расположены и буквой Г и змейкой?
Или если слово вверх пошло, то только вверх, вниз - только вниз и т.д.?
Если филворд, то прошу помощи. Выдает не те координаты
слово home (5,3) - (4,1). Определяет не ту букву Е, которую надо по условию.
Нужны советы по упрощению кода)
UPD
Переписал под вариант, если слова только по линии, но все равно не проходит
Пишет: Размер списка возвращаемого методом detectAllWords отличается от правильного!
Старый вариант закомментирован
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', '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'}
};
List words = (detectAllWords(crossword, "pmlpml","m"));
for (int i = 0; i <words.size() ; i++) {
System.out.println(words.get(i));
}
System.out.println(words.size());
// 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");
// detectAllWords(crossword, "home", "same");
// for (Word dd :list){
// System.out.println(dd);
// }
/*
Ожидаемый результат
home - (5, 3) - (2, 0)
same - (1, 1) - (4, 1)
*/
}
public static List detectAllWords(int[][] crossword, String... words) {
String[] wordMSS = words;
List<Word> lst = new ArrayList<Word>();
for (int k = 0; k < wordMSS.length; k++) {
String word = wordMSS[k];
List<Word> wrds = circle(crossword, word);
for (int i = 0; i < wrds.size(); i++) {
lst.add(wrds.get(i));
}
}
return lst;
}
public static List<Word> circle(int[][] crossword, String txt) {
List<Word> wrds = new ArrayList<>();
Word wrd;
first:
for (int i = 0; i < crossword.length; i++) {
for (int j = 0; j < crossword[0].length; j++) {
if (txt.charAt(0) == (char) crossword[i][j]) {
wrd = new Word(txt);
wrd.setStartPoint(j, i);
if (txt.length()>1){
wrds = search(crossword, wrd, i, j, txt, 1);
}else {
wrd.setEndPoint(j,i);
wrds.add(wrd);
}
}
}
}
return wrds;
}
public static List<Word> search(int[][] crossword, Word wrd, int i, int j, String txt, int k) {
char start = txt.charAt(k);
List<Word> wrds = new ArrayList<>();
// {'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'}
char right = trySearch(crossword, i, j, 0, 1);
char left = trySearch(crossword, i, j, 0, -1);
char up = trySearch(crossword, i, j, -1, 0);
char down = trySearch(crossword, i, j, 1, 0);
char uleft = trySearch(crossword, i, j, -1, -1);
char uright = trySearch(crossword, i, j, -1, 1);
char dleft = trySearch(crossword, i, j, 1, -1);
char dright = trySearch(crossword, i, j, 1, 1);
// вариант - если не филворд.
// Если нашли совпадение справа - то идем дальше направо. сверху - вверх.
if (start == uleft){
int ii = i-1;
int jj = j-1;
for (int l = k; l <txt.length() ; l++) {
if (txt.charAt(l)!=trySearch(crossword,ii,jj,0,0)){wrd=null; break;}
if (l==txt.length()-1){wrd.setEndPoint(jj,ii);
wrds.add(wrd);}
ii--;
jj--;
}
}
if (start == right) {
int jj = j+1;
for (int l = k; l <txt.length() ; l++) {
if (txt.charAt(l)!=trySearch(crossword,i,jj,0,0)){wrd=null; break;}
if (l==txt.length()-1){wrd.setEndPoint(jj,i);
wrds.add(wrd);}
jj++;
}
}
if (start == left){
int jj = j-1;
for (int l = k; l <txt.length() ; l++) {
if (txt.charAt(l)!=trySearch(crossword,i,jj,0,0)){wrd=null; break;}
if (l==txt.length()-1){wrd.setEndPoint(jj,i);
wrds.add(wrd);}
jj--;
}
}
if (start == up){
int ii = i-1;
for (int l = k; l <txt.length() ; l++) {
if (txt.charAt(l)!=trySearch(crossword,ii,j,0,0)){wrd=null; break;}
if (l==txt.length()-1){wrd.setEndPoint(j,ii);
wrds.add(wrd);}
ii--;
}
}
if (start == down){
int ii = i+1;
for (int l = k; l <txt.length() ; l++) {
if (txt.charAt(l)!=trySearch(crossword,ii,j,0,0)){wrd=null; break;}
if (l==txt.length()-1){wrd.setEndPoint(j,ii);
wrds.add(wrd);}
ii++;
}
}
if (start == uright){
int jj = j+1;
int ii = i-1;
for (int l = k; l <txt.length() ; l++) {
if (txt.charAt(l)!=trySearch(crossword,ii,jj,0,0)){wrd=null; break;}
if (l==txt.length()-1){wrd.setEndPoint(jj,ii);
wrds.add(wrd);}
jj++;
ii--;
}
}
if (start == dleft){
int jj = j-1;
int ii=i+1;
for (int l = k; l <txt.length() ; l++) {
if (txt.charAt(l)!=trySearch(crossword,ii,jj,0,0)){wrd=null; break;}
if (l==txt.length()-1){wrd.setEndPoint(jj,ii);
wrds.add(wrd);}
jj--;
ii++;
}
}
if (start == dright){
int jj = j+1;
int ii=i+1;
for (int l = k; l <txt.length() ; l++) {
if (txt.charAt(l)!=trySearch(crossword,ii,jj,0,0)){wrd=null; break;}
if (l==txt.length()-1){wrd.setEndPoint(jj,ii);
wrds.add(wrd);}
jj++;
ii++;
}
}
return wrds;
}
//Если филворд
/**
public static Word search(int[][] crossword, Word wrd, int i, int j, String txt, int k) {
char start = txt.charAt(k);
boolean lastChar = true;
if (k != txt.length() - 1) {
lastChar = false;
}
// {'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'}
char right = trySearch(crossword, i, j, 0, 1);
char left = trySearch(crossword, i, j, 0, -1);
char up = trySearch(crossword, i, j, -1, 0);
char down = trySearch(crossword, i, j, 1, 0);
char uleft = trySearch(crossword, i, j, -1, -1);
char uright = trySearch(crossword, i, j, -1, 1);
char dleft = trySearch(crossword, i, j, 1, -1);
char dright = trySearch(crossword, i, j, 1, 1);
// проверяем все по кругу, если находим, проверяем последний эл-т или нет
// последний - ставим конечные точки, i и j поменяны местами.
// не последний - запускаем снова этот метод, с новыми координатами.
// i,j - координаты, k - для выбора эл-та.
if (start == uleft){
if (lastChar) {wrd.setEndPoint(j-1,i-1); } else { wrd = search(crossword,wrd,i-1,j-1,txt,k+1);} }
else if (start == right) {
if (lastChar) {wrd.setEndPoint( j+1,i); return wrd;} else { wrd = search(crossword,wrd,i,j+1,txt,k+1);} }
else if (start == left){
if (lastChar) {wrd.setEndPoint(j-1, i); } else {wrd= search(crossword,wrd,i,j-1,txt,k+1);}
}
else if (start == up){
if (lastChar) {wrd.setEndPoint(j,i-1); } else {wrd = search(crossword,wrd,i-1,j,txt,k+1);}
}
else if (start == down){
if (lastChar) {wrd.setEndPoint(j,i+1); } else {wrd = search(crossword,wrd,i+1,j,txt,k+1);}
}
else if (start == uright){
if (lastChar) {wrd.setEndPoint(j+1,i-1); } else {wrd = search(crossword,wrd,i-1,j+1,txt,k+1);}
}
else if (start == dleft){
if (lastChar) {wrd.setEndPoint(j-1,i+1); } else { wrd =search(crossword,wrd,i+1,j-1,txt,k+1);}
}
else if (start == dright){
if (lastChar) {wrd.setEndPoint(j+1,i+1); } else {wrd = search(crossword,wrd,i+1,j+1,txt,k+1);}
}
else {wrd = null;}
return wrd;
}
**/
public static char trySearch(int[][] crossword, int i, int j, int forI, int forJ) {
// i,j - начальные координаты
// forI - движение по I
// forJ - движение по J
// если на краю кроссворда, то ставим символ пробела
char result;
try {
result = (char) crossword[i + forI][j + forJ];
} catch (IndexOutOfBoundsException e) {
result = ' ';
}
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);
}
}
}