Всем привет. подскажите пожалуйста, перепробовал все возможные варианты и координаты выводит правильно, но валидатор не хочет принимать.
Ты неправильно определил положение граничных букв(ы) слов(а).
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> list = new ArrayList<>();
list = detectAllWords(crossword, "home", "same");
for (Word r : list){
System.out.println(r.toString());
}
/*
Ожидаемый результат
home - (5, 3) - (2, 0)
same - (1, 1) - (4, 1)
*/
}
public static List<Word> detectAllWords(int[][] crossword, String... words) {
List<Word> list =new ArrayList<>();
for (String word : words) {
StringBuilder stringBuilder = new StringBuilder();
int x = crossword[0].length;
int y = crossword.length;
// прямо по горизонтали (слева на право)
for (int i = 0 ; i < y; i++){
for (int j=0; j < x; j++) {
stringBuilder.append((char)crossword[i][j]);
}
String string = stringBuilder.toString();
if (string.contains(word)) {
Word word1 = new Word(word);
word1.setStartPoint( string.indexOf(word),i);
word1.setEndPoint( string.indexOf(word) + word.length()-1,i);
list.add(word1);
}
//Реверс (справа на лево)
else {
string = stringBuilder.reverse().toString();
if (string.contains(word)) {
Word word1 = new Word(word);
int xstart = (x-1) - (string.indexOf(word));
System.out.println(string.indexOf(word));
word1.setStartPoint( xstart,i);
word1.setEndPoint((xstart-(word.length()-1)),i);
list.add(word1);
}
}
stringBuilder.delete(0,stringBuilder.length());
}
//По диагонали прямо
for (int level = 0; level < x; level++){
for (int i = level, j =0; i >=0 && j <= y-1; i--){
stringBuilder.append((char)crossword[j][i]);
j++;
}
String line = stringBuilder.toString();
if (line.contains(word)) {
Word word1 = new Word(word);
int xstart = line.indexOf(word);
word1.setStartPoint(level-xstart, xstart);
word1.setEndPoint(level-xstart-word.length()+1, (xstart+word.length()-1));
list.add(word1);
}
//Реверс
/// Реверс
line = stringBuilder.reverse().toString();
if (line.contains(word)) {
Word word1 = new Word(word);
word1.setStartPoint((((level+1)-line.length())+line.indexOf(word)),((line.length()-1)-line.indexOf(word)) );
word1.setEndPoint((((level+1)-line.length())+line.indexOf(word)) +(word.length()-1),((line.length()-1)-line.indexOf(word))-(word.length()-1) );
list.add(word1);
}
stringBuilder.delete(0,stringBuilder.length());
}
//Продолжение диагонали прямо
for (int level = 1; level < y; level++){
for (int i = level, j =x-1; j >=1 && i <= y-1; j--, i++){
stringBuilder.append((char)crossword[i][j]);
}
String line = stringBuilder.toString();
if (line.contains(word)) {
Word word1 = new Word(word);
int xstart = line.indexOf(word);
word1.setStartPoint(x-1-xstart, level+xstart);
word1.setEndPoint((x-xstart-word.length()), (level+xstart+word.length()-1));
list.add(word1);
}
// Продолжение в обратном порядке
line = stringBuilder.reverse().toString();
if (line.contains(word)) {
Word word1 = new Word(word);
int xstart = line.indexOf(word);
word1.setStartPoint((((x)-line.length())+line.indexOf(word)),(y-1) - line.indexOf(word));
word1.setEndPoint(((((x)-line.length())+line.indexOf(word))+word.length()-1),(((y-1) - line.indexOf(word))-word.length()+1));
list.add(word1);
}
stringBuilder.delete(0,stringBuilder.length());
}
//По диагонали в обратном направлении
for (int level = 0; level < x-1; level++){
for (int i = level,j = y-1; j >=0 && i >= 0 ; j--,i--){
stringBuilder.append((char)crossword[j][i]);
}
String string = stringBuilder.toString();
if (string.contains(word)){
Word word1 = new Word(word);
word1.setStartPoint((level - string.indexOf(word)),(y-1)-string.indexOf(word));
word1.setEndPoint(((level - string.indexOf(word))) - (word.length()-1),(((y-1)-string.indexOf(word)) - (word.length()-1)));
list.add(word1);
}
//тут доделать надо
string = stringBuilder.reverse().toString();
if (string.contains(word)){
Word word1 = new Word(word);
word1.setStartPoint((string.indexOf(word)),((y-1)-level)+string.indexOf(word) );
word1.setEndPoint((string.indexOf(word)+ word.length()-1),((y-1 - (string.length()-1)) + string.indexOf(word)) + (word.length()-1));
list.add(word1);
}
stringBuilder.delete(0,stringBuilder.length());
}
//вторая половина выше не менял
for (int level = y-1; level >= 0; level--){
for (int i = level,j = x-1; j >=0 && i >= 0 ; j--,i--){
stringBuilder.append((char)crossword[i][j]);
}
String string = stringBuilder.toString();
if (string.contains(word)) {
Word word1 = new Word(word);
word1.setStartPoint(((x-1)-string.indexOf(word)),level-string.indexOf(word));
word1.setEndPoint((((x-1)-string.indexOf(word))-(word.length()-1)),((level-string.indexOf(word))-(word.length()-1)));
list.add(word1);
}
string = stringBuilder.reverse().toString();
if (string.contains(word)) {
Word word1 = new Word(word);
word1.setStartPoint(((x-1-level)+string.indexOf(word)), string.indexOf(word));
word1.setEndPoint(((x-1-level)+string.indexOf(word)+word.length()-1),string.indexOf(word)+word.length()-1);
list.add(word1);
}
stringBuilder.delete(0,stringBuilder.length());
}
for (int i = 0; i <= (x-1);i++){
for (int j = 0; j <= (y-1);j++){
stringBuilder.append((char)crossword[j][i]);
}
String string = stringBuilder.toString();
if (string.contains(word)){
Word word1 = new Word(word);
word1.setStartPoint(i,string.indexOf(word));
word1.setEndPoint(i,(string.indexOf(word)+(word.length()-1)));
list.add(word1);
}
string = stringBuilder.reverse().toString();
if (string.contains(word)){
Word word1 = new Word(word);
word1.setStartPoint(i, ((y-1)-string.indexOf(word)));
word1.setEndPoint(i, (((y-1)-string.indexOf(word))-(word.length()-1)));
list.add(word1);
}
stringBuilder.delete(0,stringBuilder.length());
}
}
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);
}
}
}