/* Eloszor osszegyujtom egy matrixba a fekete-feher ertekeket, 1, ha fekete,
* ebbol varazsolom ki a graf csomopontjait majd */
for (int y=0; y<sorokszama; y++) {
for (int x=0; x<oszlopokszama; x++) {
int celltipus = skeleton.getType(new Position(x, y));
bwMatrix[x][y] = (celltipus==ISkeletonTable.CELL_BLACK?1:0);
}
}
print(bwMatrix, "bwMatrix");
/* Eloallitom a vizszintes szavakat tartalmazo matrixot, a szavakat megszamozom 1-tol */
int hcounter = 1;
boolean inword = false;
HashMap<Integer, Integer> hCount = new HashMap<Integer, Integer>();
for (int y=0; y<sorokszama; y++) {
for (int x=0; x<oszlopokszama; x++) {
if (bwMatrix[x][y]==0) {
horizontalWords[x][y] = hcounter;
inword = true;
hCount.put(hcounter, hcounter);
} else {
if (inword) hcounter++;
inword = false;
}
}
}
print(horizontalWords, "horizontal words");
/* Ugyanez, csak fuggolegesre is. itt meg annyit csinalok, hogy lementem egy mapbe azt, hogy
* egy adott fuggoleges es vizszintes szo metszetehez, ami ugye valojaban egy cella az eredeti
* tablaban, pontosan milyen Position is tartozik. igy tehat a graf egy elehez majd siman meg tudom
* mondani, hogy az valojaban melyik cella volt. */
int vcounter = 1;
inword = false;
HashMap<Integer, Integer> vCount = new HashMap<Integer, Integer>();
HashMap<Position, Position> wordToCellMap = new HashMap<Position, Position>();
for (int x=0; x<oszlopokszama; x++) {
for (int y=0; y<sorokszama; y++) {
if (bwMatrix[x][y]==0) {
verticalWords[x][y] = vcounter;
inword = true;
vCount.put(vcounter, vcounter);
wordToCellMap.put(new Position(horizontalWords[x][y], vcounter), new Position(x, y));
} else {
if (inword) vcounter++;
inword = false;
}
}
}
print(verticalWords, "vertical words");
/* Fo ciklus. Az innerCycle fuggveny egy maximalis (maximum!) parositast ad vissza. Ezt elmentem, kiosztom az
* eleknek egy szamot, es a kovetkezo korben kiveszem a generalasbol ezeket az eleket - erre szolgal az exclusions
* map. */
ArrayList<Position> maximumMatching = null;
HashMap<Position, Boolean> exclusions = new HashMap<Position, Boolean>();
int run = 0;
int[] statistics = new int[10];
do {
maximumMatching = innerCycle(sorokszama, oszlopokszama, hCount.size(), vCount.size(), bwMatrix, horizontalWords, verticalWords, wordToCellMap, exclusions, run);
statistics[run] = maximumMatching.size();
run++;
for (int i=0; i<maximumMatching.size(); i++) {
exclusions.put(maximumMatching.get(i), true);
Position p = wordToCellMap.get(maximumMatching.get(i));
result[p.x][p.y] = run;
}
} while ((maximumMatching.size()>0) && (run<9));
HashMap<Position, Boolean> problematicEdgesMap = new HashMap<Position, Boolean>();
Iterator<Position> it = wordToCellMap.keySet().iterator();
while (it.hasNext()) {
Position e = it.next();
if (!exclusions.containsKey(e)) problematicEdgesMap.put(e, true);
}
/* problemas elek a 9-dik futas utan: ezek azok az elek a grafban, ahol nem tudott a moho algoritmus szint kiosztani
* ezekre javito ut kell */
Iterator<Position> problematicEdges = problematicEdgesMap.keySet().iterator();
while (problematicEdges.hasNext()) {
statistics[9]++;
Position edge = problematicEdges.next();
int[] freeColors = getFreeColors(edge, wordToCellMap, hCount.size(), vCount.size(), result);
System.out.println("Left out: "+edge+", free colors: "+freeColors[0]+" - "+freeColors[1]);
Position p = wordToCellMap.get(edge);
result[p.x][p.y] = freeColors[0];
Position next = edge;
HashMap<Position, Boolean> visited = new HashMap<Position, Boolean>();
boolean horizontalToVertical = false;
while ((next = getNextEnRoute(next, freeColors[0], freeColors[1], wordToCellMap, result, hCount.size(), vCount.size(), horizontalToVertical, visited))!=null) {
//invertColors(next, freeColors[0], freeColors[1], wordToCellMap, result);
horizontalToVertical ^= true;