Помогите найти ошибку, пожалуйста. Знаю, что не читабельно(писал лишь бы работало), но если вы умнее меня и сможете разобраться как нужно здесь все реализовать, обьясните что не так. Буду очень благодарен
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'}
};
List<Word> result = detectAllWords(crossword, "home", "emas", "an", "rra", "jje");
for(Word word : result){
System.out.println(word) ;
}
/*
Ожидаемый результат
home - (5, 3) - (2, 0)
same - (1, 1) - (4, 1)
*/
}
public static List<Word> detectAllWords(int[][] crossword, String... words) {
List<Word> result = new ArrayList<>();
List<Word>[] lists = findAllStrings(crossword);
for(String wordStr : words){
int startY=0;
int startX=0;
int endY=0;
int endX=0;
boolean isFound=false;
for(byte i=0; i<8 && !isFound; i++){
if(isFound){
break;
}
for(int j=0; j<lists[i].size()&&!isFound; j++){
int startIndex = lists[i].get(j).getText().indexOf(wordStr);
if(isFound){
break;
}
isFound = startIndex>=0?true:false;
Word current = lists[i].get(j);
switch(i){
case 1 : case 0:
startY= j;
startX= (i==0 ? startIndex : current.startX()-startIndex);
endY= j;
endX= startX+ (i==0 ? wordStr.length()-1 : -wordStr.length()+1);
break;
case 2 : case 3:
startY= (i==2 ? startIndex : current.startY()-startIndex);
startX= j;
endY= startIndex+(i==2 ? wordStr.length()-1 : -wordStr.length()+1);
endX= j;
break;
case 4 : case 5:
startY= (i==4 ? current.startY()-startIndex : current.startY()+startIndex);
startX= (i==4 ? current.startX()+startIndex : current.startX()-startIndex);
endX = startX + (i==4 ? wordStr.length()-1 : -wordStr.length()+1);
endY = startY + (i==4 ? -wordStr.length()+1 : wordStr.length()-1);
break;
case 6 : case 7:
startY= (i==6 ? current.startY()+startIndex : current.startY()-startIndex);
startX= (i==6 ? current.startX()+startIndex : current.startX()-startIndex);
endX = startX + (i==6 ? wordStr.length()-1 : -wordStr.length()+1);
endY = startY + (i==6 ? wordStr.length()-1 : -wordStr.length()+1);
break;
}
}
}
Word res = new Word(wordStr);
res.setStartPoint(startY, startX);
res.setEndPoint(endY, endX);
result.add(res);
}
return result;
}
private static List<Word>[] findAllStrings(int[][] crossword){
List<Word>[] lists = new List[8];
List<Word> rows = new ArrayList<Word>();
List<Word> reversedRows = new ArrayList<Word>();
for(int y=0; y<crossword.length; y++){
String row = "";
for(int x =0; x<crossword[0].length; x++){
row+= (char)crossword[y][x] ;
}
Word word = new Word(row);
word.setStartPoint(y, 0);
word.setEndPoint(y, crossword[0].length-1);
rows.add(word);
word = new Word(new StringBuilder(row).reverse().toString());
word.setEndPoint(y, 0);
word.setStartPoint(y, crossword[0].length-1);
reversedRows.add(word);
}
lists[0]= rows;
lists[1]= reversedRows;
List<Word> columns = new ArrayList<Word>();
List<Word> reversedColumns = new ArrayList<Word>();
for(int x=0; x<crossword[0].length; x++){
String column="";
for(int y=0; y<crossword.length; y++){
column+= (char)crossword[y][x];
}
Word word = new Word(column);
word.setStartPoint(0, x);
word.setEndPoint(crossword.length-1, x);
columns.add(word);
word = new Word(new StringBuilder(column).reverse().toString());
word.setEndPoint(0, x);
word.setStartPoint(crossword.length-1, x);
reversedColumns.add(word);
}
lists[2]= columns;
lists[3]= reversedColumns;
//по діагоналі з лівого верху до центру(вкл)
List<Word> rasingDiagonals = new ArrayList<Word>();
List<Word> rRasingDiagonals = new ArrayList<Word>();
for(int y =0; y<crossword.length; y++){
int curY=y;
int curX=0;
String diagonalUp1="";
for(int x=0; x<crossword[0].length&&curY>=0; x++){
diagonalUp1+= (char)crossword[curY][x];
curY--;
curX=x;
}
Word word = new Word(diagonalUp1);
word.setStartPoint(y, 0);
word.setEndPoint(curY, curX);
rasingDiagonals.add(word);
word = new Word(new StringBuilder(diagonalUp1).reverse().toString());
word.setEndPoint(y, 0);
word.setStartPoint(curY, curX);
rRasingDiagonals.add(word);
}
//по діагоналі з центру(не вкл) до правого низу
for(int x=1; x<crossword[0].length; x++){
int curX = x;
String diagonalUp2="";
int curY =0;
for(int y=crossword.length-1; y>=0 && curX<crossword[0].length; y--){
diagonalUp2+= (char)crossword[y][curX];
curX++;
curY=y;
}
Word word = new Word(diagonalUp2);
word.setStartPoint(crossword.length-1, x);
word.setEndPoint(curY, curX);
rasingDiagonals.add(word);
word = new Word(new StringBuilder(diagonalUp2).reverse().toString());
word.setEndPoint(crossword.length-1, x);
word.setStartPoint(curY, curX);
rRasingDiagonals.add(word);
}
lists[4]= rasingDiagonals;
lists[5]= rRasingDiagonals;
List<Word> descDiagonals = new ArrayList<Word>();
List<Word> rDescDiagonals = new ArrayList<Word>();
//по діагоналі з з лівого низу до середини(вкл)
for(int y=crossword.length-1; y>=0; y--){
String diagonalDown1 = "";
int curY = y;
int curX=0;
for(int x=0; x<crossword[0].length &&curY<crossword.length; x++){
diagonalDown1 += (char)crossword[curY][x];
curY++;
curX=x;
}
Word word = new Word(diagonalDown1);
word.setStartPoint(y, 0);
word.setEndPoint(curY, curX);
descDiagonals.add(word);
word = new Word(new StringBuilder(diagonalDown1).reverse().toString());
word.setEndPoint(y, 0);
word.setStartPoint(curY, curX);
rDescDiagonals.add(word);
}
//по діагоналі з середини до правого верху
for(int x=1; x<crossword[0].length; x++){
int curX = x;
String diagonalDown2 = "";
int curY =0;
for(int y=0; y<crossword.length && curX<crossword[0].length; y++){
diagonalDown2 += (char)crossword[y][curX];
curX++;
curY=0;
}
Word word = new Word(diagonalDown2);
word.setStartPoint(0, x);
word.setEndPoint(curY, curX);
descDiagonals.add(word);
word = new Word(new StringBuilder(diagonalDown2).reverse().toString());
word.setEndPoint(0, x);
word.setStartPoint(curY, curX);
rDescDiagonals.add(word);
}
lists[6] = descDiagonals;
lists[7] = rDescDiagonals;
return lists;
}
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 setText(String text){
this.text= text;
}
public void setStartPoint(int j, int i) {
startX = i;
startY = j;
}
public void setEndPoint(int j, int i) {
endX = i;
endY = j;
}
public String getText(){
return text;
}
public int startY(){
return startY;
}
public int startX(){
return startX;
}
public int endY(){
return endY;
}
public int endX(){
return endX;
}
@Override
public String toString() {
return String.format("%s - (%d, %d) - (%d, %d)", text, startX, startY, endX, endY);
}
}
}