import java.util.*;
public class WordSearch {
private char[][] board;
public WordSearch(int rows, int cols) {
board = new char[rows][cols];
for (int i=0;i<rows;i++)
for (int j=0;j<cols;j++)
board[i][j]='-';
}
public WordSearch() {
this(20,20);
}
public String toString() {
String s = "";
for (int i=0;i<board.length;i++) {
for (int j=0;j<board[i].length;j++) {
s=s+board[i][j];
}
s=s+"\n";
}
return s;
}
public boolean checkBoardD(int row, int col, String word, int iR, int jR) { //iR is for rows, jR is for cols
for (int i=row, j=col, x=0; x<word.length(); i=i+iR, j=j+jR, x++) {
char c = board[i][j];
if (c != word.charAt(x) && c != '-')
return false;
}
return true;
}
public boolean checkBoardH(int row, int col, String word, int iR) {
for (int i=0; Math.abs(i)<word.length(); i=i+iR) {
char c = board[row][col+i];
if (c != word.charAt(Math.abs(i)) && c != '-')
return false;
}
return true;
}
public boolean checkBoardV(int row, int col, String word, int iR) {
for (int i=0; Math.abs(i)<word.length(); i=i+iR) {
char c = board[row+i][col];
if (c != word.charAt(Math.abs(i)) && c != '-')
return false;
}
return true;
}
public boolean addWordH(int row, int col, String word, int iR) {
boolean boundaries;
if (iR == 1)
boundaries = row < board.length && row >= 0 && col >= 0 && col + word.length() <= board[0].length;
else if (iR == -1)
boundaries = row < board.length && row >= 0 && col < board[0].length && col - word.length() + 1 >= 0;
else
return false;
if (boundaries) {
if (checkBoardH(row, col, word, iR)) {
for (int i=0; Math.abs(i)<word.length(); i=i+iR)
board[row][col + i] = word.charAt(Math.abs(i));
return true;
}
}
return false;
}
public boolean addWordV(int row, int col, String word, int iR) {
boolean boundaries;
if (iR == 1)
boundaries = col < board[0].length && row >= 0 && col >= 0 && row + word.length() <= board.length;
else if (iR == -1)
boundaries = col < board[0].length && col >= 0 && row < board.length && row - word.length() + 1 >= 0;
else
return false;
if (boundaries) {
if (checkBoardV(row, col, word, iR)) {
for (int i=0; Math.abs(i)<word.length(); i=i+iR)
board[row + i][col] = word.charAt(Math.abs(i));
return true;
}
}
return false;
}
public boolean addWordD(int row, int col, String word, int iR, int jR) {
boolean boundaries;
if (iR == 1 && jR == 1)
boundaries = row >= 0 && col >= 0 && row + word.length() <= board.length && col + word.length() <= board[0].length;
else if (iR == -1 && jR == 1)
boundaries = row - word.length() + 1 >= 0 && col >= 0 && row < board.length && col + word.length() <= board[0].length;
else if (iR == 1 && jR == -1)
boundaries = row >= 0 && col - word.length() + 1 >= 0 && row + word.length() <= board.length && col < board[0].length;
else if (iR == -1 && jR == -1)
boundaries = row - word.length() + 1 >= 0 && col - word.length() + 1 >= 0 && row < board.length && col < board[0].length;
else
return false;
if (boundaries) {
if (checkBoardD(row, col, word, iR, jR)) {
for (int i=row, j=col, x=0; x<word.length(); i=i+iR, j=j+jR, x++)
board[i][j] = word.charAt(x);
return true;
}
}
return false;
}
public void addWord(int row, int col, String word) {
Random r = new Random();
int x = r.nextInt(8);
switch(x) {
case 0:
addWordV(row, col, word, -1);
case 1:
addWordD(row, col, word, -1, 1);
case 2:
addWordH(row, col, word, 1);
case 3:
addWordD(row, col, word, 1, 1);
case 4:
addWordV(row, col, word, 1);
case 5:
addWordD(row, col, word, 1, -1);
case 6:
addWordH(row, col, word, -1);
case 7:
addWordD(row, col, word, -1, -1);
default:
System.out.println("ERROR");
}
System.out.println(toString());
}
/*public void fillIn() {
char[][] w2 = Arrays.copyOf(board);
Arrays.sort(w2);
while (Arrays.binarySearch(w2, '-') == 0) {*/
}