import java.util.*;
import java.io.*;
public class WordSearch{
private int rows, cols, listlength;
private char[][] board;
private ArrayList<String> words = new ArrayList<String>();
private ArrayList<String> selected = new ArrayList<String>();
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]='$';
}
}
this.rows = rows;
this.cols = cols;
getList();
}
public WordSearch() {
this(20,20);
}
public boolean addWord(int row, int col, String word, int d){
/* int d indicates which position you want to insert the word in
1 = Horizontal Forward
2 = Horizontal Backward
3 = Right Downward
4 = Right Upward
5 = Left Upward
6 = Left Downward
7 = Vertical Upward
8 = Vertical Downward
*/
int length = 0;
int width = 0;
int nlength = 0;
int nwidth = 0;
int n = 0;
int m = 0;
if(d==1){
length = word.length();
width = 0;
nlength = 0;
nwidth = 0;
n = 0;
m = 1;
}
else if(d==2){
length = 0;
width = 0;
nlength = -1 * word.length();
nwidth = 0;
n = 0;
m = -1;
else if(d==3){
length = word.length();
width = word.length();
nlength = 0;
nwidth = 0;
n = 1;
m = 1;
}
else if(d==4){
length = word.length();
width = 0;
nlength = 0;
nwidth = -1 * word.length();
n = -1;
m = 1;
}
else if(d==5){
length = 0;
width = 0;
nlength = -1 * word.length();
nwidth = -1 * word.length();
n = -1;
m = -1;
}
else if(d==6){
length = 0;
width = word.length();
nlength = -1 * word.length();
nwidth = 0;
n = 1;
m = -1;
}
else if(d==7){
length = 0;
width = 0;
nlength = 0;
nwidth = -1 * word.length();
n = -1;
m = 0;
}
else{
length = 0;
width = word.length();
nlength = 0;
nwidth = 0;
n = 1;
m = 0;
}
if(row+nwidth<0||col+length>cols||col+nlength<0||row+width>rows){
return false;
}
int i = 0;
int j = 0;
int k = 0;
while(k<word.length()){
if(board[row+i][col+j] != '$'&& board[row+i][col+j] != word.charAt(k)){
return false;
}
i = i + n;
j = j + m;
k = k + 1;
}
i = 0;
j = 0;
k = 0;
while(k<word.length()){
board[row+i][col+j] = word.charAt(k);
i = i + n;
j = j + m;
k = k + 1;
}
selected.add(word);
return true;
}
public void getList() {
try{
Scanner s = new Scanner(new File("word"));
listlength = 0;
while(s.hasNext()){
String d = s.next();
words.add(d);
listlength++;
}
}
catch (Exception e){}
}
public boolean availability(String word) {
if(word.length() > 1 && !selected.contains(word))
return true;
return false;
}
public boolean tryToAddWord() {
Random r = new Random();
String word = words.get(r.nextInt(listlength));
word = word.toUpperCase();
for(int i =0; i<5;i++){
if (availability(word) && addWord(r.nextInt(rows),r.nextInt(cols),word,(r.nextInt(8)))){
return true;
}
}
return false;
}
public void fillIn(){
Random r = new Random();
for(int i =0; i<board.length;i++){
for(int j=0; j<board[i].length;j++){
if(board[i][j] == '$')
board[i][j] = (char)('A'+r.nextInt('Z'-'A'+1));
}
}
}
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";
}
s = s + "\n" + selected.toString();
return s;
}
}