Improved collision checker
Also removed verbose logging
This commit is contained in:
parent
472106ba3a
commit
79dbff72c1
2 changed files with 24 additions and 13 deletions
|
@ -80,6 +80,11 @@ public class Generator {
|
||||||
}
|
}
|
||||||
System.out.println("Possible placements: " + possiblePlacements.size() + " * 2");
|
System.out.println("Possible placements: " + possiblePlacements.size() + " * 2");
|
||||||
|
|
||||||
|
int totalCharacters = Arrays.stream(words).map(w -> w.length() + 1).reduce(0, Integer::sum);
|
||||||
|
if (totalCharacters > possiblePlacements.size()) {
|
||||||
|
System.out.printf("Warning: there might be no solution (%d > %d)", totalCharacters, possiblePlacements.size());
|
||||||
|
}
|
||||||
|
|
||||||
/*for (Word word : words) {
|
/*for (Word word : words) {
|
||||||
PlacedWord placedWord = null;
|
PlacedWord placedWord = null;
|
||||||
|
|
||||||
|
@ -132,13 +137,13 @@ public class Generator {
|
||||||
}
|
}
|
||||||
|
|
||||||
private Set<PlacedWord> follow(Grid grid, Set<PlacedWord> placedChain, int wordIndex) {
|
private Set<PlacedWord> follow(Grid grid, Set<PlacedWord> placedChain, int wordIndex) {
|
||||||
System.out.println("Depth " + wordIndex);
|
//System.out.println("Depth " + wordIndex);
|
||||||
|
|
||||||
if (wordIndex > peakDepth)
|
if (wordIndex > peakDepth)
|
||||||
peakDepth = wordIndex;
|
peakDepth = wordIndex;
|
||||||
|
|
||||||
if (wordIndex == words.length) {
|
if (wordIndex == words.length) {
|
||||||
System.out.println(" Completed");
|
//System.out.println(" Completed");
|
||||||
return placedChain;
|
return placedChain;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -163,8 +168,8 @@ public class Generator {
|
||||||
|
|
||||||
PlacedWord candidate = new PlacedWord(placement, vertical, word);
|
PlacedWord candidate = new PlacedWord(placement, vertical, word);
|
||||||
|
|
||||||
if (grid.canPlace(candidate)) {
|
if (grid.canPlace(candidate) != -1) {
|
||||||
System.out.println(" Found candidate");
|
//System.out.println(" Found candidate");
|
||||||
Set<PlacedWord> potentialChain = new HashSet<>(placedChain);
|
Set<PlacedWord> potentialChain = new HashSet<>(placedChain);
|
||||||
potentialChain.add(candidate);
|
potentialChain.add(candidate);
|
||||||
|
|
||||||
|
@ -172,20 +177,20 @@ public class Generator {
|
||||||
newGrid.placeWord(candidate);
|
newGrid.placeWord(candidate);
|
||||||
|
|
||||||
Set<PlacedWord> newChain = follow(newGrid, potentialChain, wordIndex + 1);
|
Set<PlacedWord> newChain = follow(newGrid, potentialChain, wordIndex + 1);
|
||||||
System.out.println("Back to depth " + wordIndex);
|
//System.out.println("Back to depth " + wordIndex);
|
||||||
|
|
||||||
// if it's null it means there's no good placement, and we should continue searching at this depth
|
// if it's null it means there's no good placement, and we should continue searching at this depth
|
||||||
if (newChain != null) {
|
if (newChain != null) {
|
||||||
System.out.println(" Unfolding"); // is that a correct word?
|
//System.out.println(" Unfolding"); // is that a correct word?
|
||||||
return newChain;
|
return newChain;
|
||||||
} else {
|
} else {
|
||||||
System.out.println(" Looking further");
|
//System.out.println(" Looking further");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
System.out.println(" No solution");
|
//System.out.println(" No solution");
|
||||||
// no placement at this depth
|
// no placement at this depth
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
|
@ -46,9 +46,11 @@ public class Grid implements Cloneable {
|
||||||
* Can a word be placed, will it not collide
|
* Can a word be placed, will it not collide
|
||||||
*
|
*
|
||||||
* @param word The word
|
* @param word The word
|
||||||
* @return can it be placed
|
* @return can it be placed. -1 = no, 0 = yes, >0 = yes and will be over n characters
|
||||||
*/
|
*/
|
||||||
public boolean canPlace(PlacedWord word) {
|
public int canPlace(PlacedWord word) {
|
||||||
|
int cols = 0;
|
||||||
|
|
||||||
int x = word.pos().x();
|
int x = word.pos().x();
|
||||||
int y = word.pos().y();
|
int y = word.pos().y();
|
||||||
|
|
||||||
|
@ -67,12 +69,16 @@ public class Grid implements Cloneable {
|
||||||
c = word.word().text().charAt(i);
|
c = word.word().text().charAt(i);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (charArray[_x][_y] != 0 && charArray[_x][_y] != c) {
|
if (charArray[_x][_y] != 0) {
|
||||||
return false;
|
if (charArray[_x][_y] != c) {
|
||||||
|
return -1;
|
||||||
|
} else {
|
||||||
|
cols++;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return cols;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
Loading…
Reference in a new issue