Всем привет.
Help Me please!
задачу решал 3 дня, все настроил, протестировал для случаев по вертикали, горизонтали, диагонали, туда- обратно. Также с учетом расположения слов в начале, в середине, в конце строки.
Ошибок не вижу, все считает корректно. Но валик не пускает.
Может быть кто-то сможет помочь, что не так? Не хотелось бы чужое решение копировать.
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', 'h'},
{'u', 's', 'a', 'm', 'e', 'o'},
{'l', 'n', 'g', 'o', 'o', 'v'},
{'m', 'l', 'm', 'r', 'r', 'h'},
{'p', 'e', 'e', 'e', 'j', 'j'}
};
detectAllWords(crossword, "same","home");
/*
Ожидаемый результат
home - (5, 3) - (2, 0) p l g m l
same - (1, 1) - (4, 1)
*/
}
public static List<Word> detectAllWords(int[][] crossword, String... words) {
List<String> listHorizont = new ArrayList<>();
List<String> listVertical = new ArrayList<>();
List<Word> listFinal = new ArrayList<>();
List<Word> list = new ArrayList<>();
for (String s : words) {
Word w1 = new Word(s);
list.add(w1);
}
int height = crossword.length;
int width = crossword[0].length;
int ndiag = height+width-1;
char[][] crossword_1 = new char[height][width];
for (int j = 0; j < height; j++) {
for (int i = 0; i < width; i++) {
crossword_1[j][i]= (char) crossword[j][i];
// System.out.println(crossword_1[j][i]);
}
}
//********** перенос данных в списки Диагональ 2 ******************//
for (int diag = 0; diag < ndiag; diag++) {
int col=0;
int str=0;
String slovoDiag1 = "";
int row_start = Math.max(0, diag - width + 1);// 0 0 0
int row_stop = Math.min(diag, height - 1); // 0 1 2
for (int row = row_start; row <= row_stop; row++) { // 1 2 3
col = width-1 -diag + row; // 0 0 1
// System.out.println(crossword[row][col]+" " +col+" "+row);
slovoDiag1 = slovoDiag1 +String.format(String.valueOf(crossword_1[row][col]));
str = row; // 0 1 0
}
// System.out.println(slovoDiag1);
// listDiag1.add(slovoDiag1);
//********** поиск по диагонали 2 ******************//
for (Word s : list) {
int dlina_Slova = s.text.length();
if (slovoDiag1.length() >= dlina_Slova) {
// System.out.println(" col = "+ col + " str = " +str);
for (int j = 0; j < slovoDiag1.length() - dlina_Slova + 1; j++) { //*** берем все возможные комбинации слова в строке
StringBuilder stringBuilder = new StringBuilder(slovoDiag1.substring(j, j + dlina_Slova));
if (s.text.equals(stringBuilder.toString())) {
Word w = new Word(s.text);
w.setStartPoint(col-(slovoDiag1.length()-dlina_Slova)+j-dlina_Slova+1, str-(slovoDiag1.length()-dlina_Slova)+j-dlina_Slova+1 );
w.setEndPoint(col-(slovoDiag1.length()-dlina_Slova)+j, str-(slovoDiag1.length()-dlina_Slova)+j );
// System.out.println(s);
listFinal.add(w);
} else if (s.text.equals(stringBuilder.reverse().toString())) {
Word w = new Word(s.text);
w.setStartPoint(col-(slovoDiag1.length()-dlina_Slova)+j, str-(slovoDiag1.length()-dlina_Slova)+j );
w.setEndPoint(col-(slovoDiag1.length()-dlina_Slova)+j-dlina_Slova+1, str-(slovoDiag1.length()-dlina_Slova)+j-dlina_Slova+1);
// System.out.println(s);
listFinal.add(w);
}
}
}
}
}
//********** перенос данных в списки Диагональ 1 ******************//
for (int diag = 0; diag < ndiag; diag++) {
int col=0;
int str=0;
String slovoDiag1 = "";
int row_stop = Math.max(0, diag - width + 1);// 0
int row_start = Math.min(diag, height - 1); //
for (int row = row_start; row >= row_stop; row--) { // 1
col = diag - row; // 0
// System.out.println(crossword[row][col]+" " +col+" "+row);
slovoDiag1 = slovoDiag1 +String.format(String.valueOf(crossword_1[row][col]));
str = row;
}
// System.out.println(slovoDiag1);
//********** поиск по диагонали 1 ******************
for (Word s : list) {
int dlina_Slova = s.text.length();
if (slovoDiag1.length() >= dlina_Slova) {
// System.out.println(" col = "+ col + " str = " +str);
for (int j = 0; j < slovoDiag1.length() - dlina_Slova + 1; j++) { //*** берем все возможные комбинации слова в строке
StringBuilder stringBuilder = new StringBuilder(slovoDiag1.substring(j, j + dlina_Slova));
if (s.text.equals(stringBuilder.toString())) {
Word w = new Word(s.text);
w.setStartPoint(col-(slovoDiag1.length()-dlina_Slova)+j-dlina_Slova+1, str+(slovoDiag1.length()-dlina_Slova)-j+dlina_Slova-1 );
w.setEndPoint(col-(slovoDiag1.length()-dlina_Slova)+j, str+(slovoDiag1.length()-dlina_Slova)-j );
// System.out.println(s);
listFinal.add(w);
} else if (s.text.equals(stringBuilder.reverse().toString())) {
Word w = new Word(s.text);
w.setStartPoint(col-(slovoDiag1.length()-dlina_Slova)+j, str+(slovoDiag1.length()-dlina_Slova)-j );
w.setEndPoint(col-(slovoDiag1.length()-dlina_Slova)+j-dlina_Slova+1, str+(slovoDiag1.length()-dlina_Slova)-j+dlina_Slova-1 );
// System.out.println(s);
listFinal.add(w);
}
}
}
}
}
//********** перенос данных в списки Горизонт ******************//
for (int i = 0; i < height; i++) { //********** начало внешнего цикла
String slovo = "";
for (int j = 0; j < width; j++) { //********** начало внутреннего цикла
slovo = slovo + String.format(String.valueOf(crossword_1[i][j]));
} //********** конец внутреннего цикла
// System.out.println(slovo);
listHorizont.add(slovo);
} //********** конец внешнего цикла
//********** перенос данных в списки Вертикаль ******************//
for (int j = 0; j < width; j++) {
String slovoVert = "";
for (int i = 0; i < height; i++) {
slovoVert = slovoVert + String.format(String.valueOf(crossword_1[i][j]));
}
// System.out.println(slovoVert);
listVertical.add(slovoVert);
}
//********** поиск по вертикали ******************//
for (Word s : list) {
int dlina_Slova = s.text.length();
for (int i = 0; i < listVertical.size(); i++) { //*** берем строку
for (int j = 0; j < listVertical.get(i).length() - dlina_Slova + 1; j++) { //*** берем все возможные комбинации слова в строке
StringBuilder stringBuilder = new StringBuilder(listVertical.get(i).substring(j, j + dlina_Slova));
if (s.text.equals(stringBuilder.toString())) {
Word w = new Word(s.text);
w.setStartPoint(i, j);
w.setEndPoint(i, j + dlina_Slova - 1);
// System.out.println(s);
listFinal.add(w);
} else if (s.text.equals(stringBuilder.reverse().toString())) {
Word w = new Word(s.text);
w.setStartPoint(i,j + dlina_Slova - 1);
w.setEndPoint(i, j);
// System.out.println(s);
listFinal.add(w);
// listFinal.add(new Word(stringBuilder.toString()));
}
}
}
}
//********** поиск по горизонтали ******************//
for (Word s : list) {
int dlina_Slova = s.text.length();
for (int i = 0; i < listHorizont.size(); i++) { //*** берем строку
for (int j = 0; j < listHorizont.get(i).length() - dlina_Slova + 1; j++) { //*** берем все возможные комбинации слова в строке
StringBuilder stringBuilder = new StringBuilder(listHorizont.get(i).substring(j, j + dlina_Slova));
if (s.text.equals(stringBuilder.toString())) {
Word w = new Word(s.text);
w.setStartPoint(j, i);
w.setEndPoint(j + dlina_Slova - 1, i);
// System.out.println(s);
listFinal.add(w);
} else if (s.text.equals(stringBuilder.reverse().toString())) {
Word w = new Word(s.text);
w.setStartPoint(j + dlina_Slova - 1, i);
w.setEndPoint(j, i);
// System.out.println(s);
listFinal.add(w);
// listFinal.add(new Word(stringBuilder.toString()));
}
}
}
}
listFinal.forEach(x -> System.out.println(x));
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);
}
}
}