I can't figure out why...
package com.codegym.task.task20.task2027;
import java.util.*;
/*
Word search
*/
public class Solution {
public static List<Word> detectAllWords(int[][] matrix, String... words) {
List<Word> array = new ArrayList<>();
for (String word : words) {
char[] chars = word.toCharArray();
for (int row = 0; row < matrix.length; row ++) {
for (int column = 0; column < matrix[0].length; column ++) {
if (matrix[row][column] == chars[0]) {
detect(matrix, chars, row, column).ifPresent(array::addAll);
}
}
}
}
return array;
}
public static Optional<List<Word>> detect(int[][] haystack, char[] needle, int row, int column) {
List<Word> words = new ArrayList<>();
String text = String.valueOf(needle);
int length = needle.length;
int[] axes = {1, -1};
for (int axe: axes) {
boolean rowAxe = true, columnAxe = true;
boolean[] diagonalAxes = {true, true};
for (int index = 0; index < length; index ++) {
int increment = axe * index;
boolean rowIncrement = row + increment < haystack.length && row + increment + 1 > 0;
boolean columnIncrement = column + increment < haystack[0].length && column + increment + 1 > 0;
boolean columnDecrement = column - increment < haystack[0].length && column - increment + 1> 0 ;
rowAxe = rowIncrement && rowAxe && (haystack[row + increment][column] == needle[index]);
columnAxe = columnIncrement && columnAxe && (haystack[row][column + increment] == needle[index]);
diagonalAxes[0] = (rowIncrement && columnIncrement) &&
diagonalAxes[0] && haystack[row + increment][column + increment] == needle[index];
diagonalAxes[1] = (rowIncrement && columnDecrement) &&
diagonalAxes[1] && haystack[row + increment][column - increment] == needle[index];
if (!rowAxe && !columnAxe && !diagonalAxes[0] && !diagonalAxes[1]) { break; }
}
if (rowAxe) words.add(new Word(text, column, row, column, row + axe * (length - 1)));
if (columnAxe) words.add(new Word(text, column, row, column + axe * (length - 1), row));
if (diagonalAxes[0]) words.add(
new Word(text, column, row, column + axe * (length - 1), row + axe * (length - 1))
);
if (diagonalAxes[1]) words.add(
new Word(text, column, row, column - axe * (length - 1), row + axe * (length - 1))
);
}
return Optional.of(words);
}
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 Word(String text, int startX, int startY, int endX, int endY) {
this(text);
setStartPoint(startX, startY);
setEndPoint(endX, endY);
}
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);
}
}
}
package com.codegym.task.task20.task2027;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Optional;
/*
Word search
*/
public class Solution {
public static void main(String[] args) {
int[][] wordSearch = new int[][]{
{'f', 'd', 'e', 'e', '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'}
};
detectAllWords(wordSearch, "home", "same", "rad", "jo", "ome", "emas", "rme").forEach(System.out::println);
/*
Expected result
home - (5, 3) - (2, 0)
same - (1, 1) - (4, 1)
*/
}
public static List<Word> detectAllWords(int[][] wordSearch, String... words) {
List<Word> array = new ArrayList<>();
for (String word : words) {
char[] wordToDetect = word.toCharArray();
for (int row = 0; row < wordSearch.length; row ++) {
for (int column = 0; column < wordSearch[0].length; column ++) {
if (wordSearch[row][column] == wordToDetect[0]) {
detectWord(wordSearch, wordToDetect, row, column).ifPresent(array::addAll);
}
}
}
}
return array;
}
public static Optional<List<Word>> detectWord(int[][] wordSearch, char[] word, int row, int column) {
int length = word.length;
int stepRow = row + length > wordSearch.length ? -1 : 1;
int stepColumn = column + length > wordSearch[0].length ? -1 : 1;
boolean rowAxe = true, columnAxe = true, bothAxe = true;
boolean rowAxeReverse = row + length == wordSearch.length;
boolean columnAxeReverse = column + length == wordSearch[0].length;
for (int index = 0; index < length; index ++) {
if (rowAxe && !(wordSearch[row + stepRow * index][column] == word[index])) { rowAxe = false; }
if (rowAxeReverse && !(wordSearch[row - stepRow * index][column] == word[index])) { rowAxeReverse = false; }
if (columnAxe && !(wordSearch[row][column + stepColumn * index] == word[index])) { columnAxe = false; }
if (columnAxeReverse && !(wordSearch[row][column - stepColumn * index] == word[index])) { columnAxeReverse = false; }
if (bothAxe && !(wordSearch[row + stepRow * index][column + stepColumn * index] == word[index])) { bothAxe = false; }
if (!rowAxe && !rowAxeReverse && !columnAxe && !columnAxeReverse && !bothAxe) { return Optional.empty(); }
}
List<Word> array = new ArrayList<>();
if (rowAxe) {
Word detected = new Word(String.valueOf(word));
detected.setStartPoint(column, row);
detected.setEndPoint(column, row + stepRow * (length - 1));
array.add(detected);
}
if (rowAxeReverse) {
Word detected = new Word(String.valueOf(word));
detected.setStartPoint(column, row);
detected.setEndPoint(column, row - stepRow * (length - 1));
array.add(detected);
}
if (columnAxe) {
Word detected = new Word(String.valueOf(word));
detected.setStartPoint(column, row);
detected.setEndPoint(column + stepColumn * (length - 1), row );
array.add(detected);
}
if (columnAxeReverse) {
Word detected = new Word(String.valueOf(word));
detected.setStartPoint(column, row);
detected.setEndPoint(column - stepColumn * (length - 1), row );
array.add(detected);
}
if (bothAxe) {
Word detected = new Word(String.valueOf(word));
detected.setStartPoint(column, row);
detected.setEndPoint(column + stepColumn * (length - 1), row + stepRow * (length - 1));
array.add(detected);
}
return Optional.of(array);
}
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);
}
}
}