007
27.01.2004, 01:17 Uhr
NemoEimi
|
Huhu,
da das endlich mal wieder ein Performancerätsel ist, also nichts zum Golfen (bei den Golfrätseln bekomme ich immer so Minderwertigkeitskomplexe ) , habe ich mich eben auch dazu entschlossen, eine Lösung (also ein Programm zum Generieren/Durchzählen der gewünschten Positionen) zusammenzubasteln, obwohl ich nicht das Geburtstagskind bin . Hier ist das Ergebnis :
C++: |
class DamenBrett { private int size; private int linie_aktuell; private boolean fertig; private int[] damen_pos; private boolean[] reihe_belegt; private boolean[] diag1_belegt; private boolean[] diag2_belegt; private int calc_diag1(int linie, int reihe) { return(linie + reihe); } private int calc_diag2(int linie, int reihe) { return(linie - reihe + size); } public boolean setze_dame(int reihe) { if (fertig) return(false); if (reihe_belegt[reihe]) return(false); int diag1 = calc_diag1(linie_aktuell, reihe); if (diag1_belegt[diag1]) return(false); int diag2 = calc_diag2(linie_aktuell, reihe); if (diag2_belegt[diag2]) return(false); damen_pos[linie_aktuell] = reihe; reihe_belegt[reihe] = true; diag1_belegt[diag1] = true; diag2_belegt[diag2] = true; linie_aktuell = linie_aktuell + 1; if (linie_aktuell == size) fertig = true; return(true); } public boolean problem_solved() { return(fertig); } public void rem_dame() { linie_aktuell = linie_aktuell - 1; int reihe = damen_pos[linie_aktuell]; reihe_belegt[reihe] = false; int diag1 = calc_diag1(linie_aktuell, reihe); int diag2 = calc_diag2(linie_aktuell, reihe); diag1_belegt[diag1] = false; diag2_belegt[diag2] = false; fertig = false; } public DamenBrett(int n) { size = n; linie_aktuell = 0; fertig = false; damen_pos = new int[size]; reihe_belegt = new boolean[size]; diag1_belegt = new boolean[2*size]; diag2_belegt = new boolean[2*size]; } }
public class damen{ public static int loesungen = 0; public static int size = 0; public static void solve_rec(DamenBrett brett) { if (brett.problem_solved()) {loesungen = loesungen + 1; return;} for (int i = 0; i < size; i++) { boolean weiter = brett.setze_dame(i); if (weiter) {solve_rec(brett); brett.rem_dame();} } } public static void main(String[] args) { int n = Integer.parseInt(args[0]); size = n; DamenBrett brett = new DamenBrett(n); solve_rec(brett); System.out.println("Anzahl gefundener Lösungen:" + loesungen); } }
|
Grüße, Nemo Dieser Post wurde am 27.01.2004 um 01:20 Uhr von NemoEimi editiert. |