Improved collision checker

Also removed verbose logging
This commit is contained in:
Minecon724 2024-10-07 16:35:30 +02:00
parent 472106ba3a
commit 79dbff72c1
Signed by: Minecon724
GPG key ID: 3CCC4D267742C8E8
2 changed files with 24 additions and 13 deletions

View file

@ -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;
} }

View file

@ -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