xpad.c
Ensign
- Registriert
- Dez. 2020
- Beiträge
- 246
Wenn es für diese Muster tatsächlich möglich ist, von der 1 zur 6 zu gelangen, wird es natürlich ungleich schwieriger, das Ganze zu testen.
Ansonsten folgende Anmerkungen:
1) Du hast Muster der Länge 1 komplett ignoriert, das kannst Du beheben, indem nach dem Hinzufügen von i direkt auf die erreichte Länge testest und - falls erreicht - die Summe um 1 erhöhst. 3x3 mit Länge 1 ergibt dann bspw. in Summe 9 für einmal alle 9 einzelnen Ziffern. Bei Dir bisher 0.
Nochmal Edith: habe das nur so gemacht, weil da noch eine Testausgabe dabei war. Im Prinzip könnte man auch direkt auf (Länge - 1) testen, und das Hinzufügen/Löschen von i dann einfach weglassen.
2) Tests mit Negation sind generell schwierig zu verstehen, zumal das auch noch 2 Negationen sind. Vorschlag: den Test validMove nennen, und die Prüfung auf Vorhandensein in der Menge gleich mit da rein packen.
Edith sagt: ach so, habe noch deltaX und deltaY für die Prüfung der Diagnole bzw. der Richtung verwendet. Damit könnte man ggf. die Winkel und die möglichen anderen Optionen (1->6) auch abdecken, wenn man sich was Cleveres überlegt. Schwierigkeiten hatte ja der Kollege schon genannt.
3) Im Prinzip läuft ja das Setzen von last darauf hinaus, dass man nur die innere Schleife mit fixiertem i hat.
Ich habe daher in der Variante unten dort auch j statt i genommen für den unteren Teil, weniger Verwirrung.
Man könnte da ggf. auch direkt die äußere "Schleife" so fixieren, dann muss den inneren Teil nur einmal schreiben, dafür ist es mir aber jetzt zu spät.
Nach dem Lesen des anderen Kommentars:
Wenn man mehr als die Diagonalen will, reicht es wahrscheinlich auch nicht, sich die Menge der schon besuchten Knoten zu merken, sondern man braucht das ggf. als Liste. Dann könnte man sich aber auch last sparen, das wäre dann das letzte Element besagter Liste.
HTH,
xpad.c
Ansonsten folgende Anmerkungen:
1) Du hast Muster der Länge 1 komplett ignoriert, das kannst Du beheben, indem nach dem Hinzufügen von i direkt auf die erreichte Länge testest und - falls erreicht - die Summe um 1 erhöhst. 3x3 mit Länge 1 ergibt dann bspw. in Summe 9 für einmal alle 9 einzelnen Ziffern. Bei Dir bisher 0.
Nochmal Edith: habe das nur so gemacht, weil da noch eine Testausgabe dabei war. Im Prinzip könnte man auch direkt auf (Länge - 1) testen, und das Hinzufügen/Löschen von i dann einfach weglassen.
2) Tests mit Negation sind generell schwierig zu verstehen, zumal das auch noch 2 Negationen sind. Vorschlag: den Test validMove nennen, und die Prüfung auf Vorhandensein in der Menge gleich mit da rein packen.
Edith sagt: ach so, habe noch deltaX und deltaY für die Prüfung der Diagnole bzw. der Richtung verwendet. Damit könnte man ggf. die Winkel und die möglichen anderen Optionen (1->6) auch abdecken, wenn man sich was Cleveres überlegt. Schwierigkeiten hatte ja der Kollege schon genannt.
3) Im Prinzip läuft ja das Setzen von last darauf hinaus, dass man nur die innere Schleife mit fixiertem i hat.
Ich habe daher in der Variante unten dort auch j statt i genommen für den unteren Teil, weniger Verwirrung.
Man könnte da ggf. auch direkt die äußere "Schleife" so fixieren, dann muss den inneren Teil nur einmal schreiben, dafür ist es mir aber jetzt zu spät.
Code:
function calcPatterns1(n, len, last = -1, visited = new Set()) {
if (visited.size == len) {
return 1;
}
let sum = 0;
if (last == -1) {
for (let i = 0; i < n * n; i++) {
visited.add(i); // Start from each cell
if (visited.size == len) {
sum += 1;
visited.delete(i);
continue;
}
for (let j = 0; j < n * n; j++) {
if (validMove(i, j, n, visited)) {
visited.add(j);
sum += calcPatterns1(n, len, j, visited);
visited.delete(j);
}
}
visited.delete(i);
}
return sum;
}
for (let j = 0; j < n * n; j++) {
if (validMove(last, j, n, visited)) {
visited.add(j);
sum += calcPatterns1(n, len, j, visited);
visited.delete(j);
}
}
return sum;
}
function validMove(from, to, n, visited) {
if (from == to) return false;
if (visited.has(to)) return false;
let x1 = parseInt(from / n);
let y1 = from % n;
let x2 = parseInt(to / n);
let y2 = to % n;
let deltaX = Math.abs(x1 - x2);
let deltaY = Math.abs(y1 - y2);
return (deltaX < 2 && deltaY < 2);
}
Nach dem Lesen des anderen Kommentars:
Wenn man mehr als die Diagonalen will, reicht es wahrscheinlich auch nicht, sich die Menge der schon besuchten Knoten zu merken, sondern man braucht das ggf. als Liste. Dann könnte man sich aber auch last sparen, das wäre dann das letzte Element besagter Liste.
HTH,
xpad.c
Zuletzt bearbeitet: