Problem 15:
rozpoczynające się w górnym lewym rogu 2 x 2 siatki znajduje się 6 trasy (bez nawrotów) do dolnego prawego rogu.
Ile jest tras przez siatkę 20 × 20?uzyskanie wszystkich możliwych ścieżek DOWN nie i prawej krawędzi w nX n siatki
Więc moja próba Problem 15 jest trochę bruteforcy ponieważ staram się uzyskać permutacji wszystkich możliwych ważnych ścieżek przechodząc od prawej do lewej i zmieniając poprzednika pierwszej zmianie kierunku. Na przykład, gdy mam siatkę 2x2 (spójrz na grafikę łącza Problem 15) pierwszą ścieżką, którą wezmę, jest prawy - prawy - dół - dół, a ostatni, który wezmę, to w dół - w dół - w prawo - prawo, co jest również moim kryterium zakończenia. Dodaję możliwe poprawne ścieżki do listy, a także używam tej listy, aby określić, czy poprawna ścieżka została już dodana, czy nie. I aby permutować ścieżkę, zrobię to, o czym wspomniałem wcześniej: przechodzę od prawej do lewej w mojej tablicy (która na grafice będzie w prawym dolnym rogu, gdzie wskazuje grot strzałki) i zmieni pierwszy element, z którego następny element jest inny niż on sam. Tak więc w prawo - w dół - w dół stałoby się prawo - prawo - prawo - dół, co oczywiście jest nieważne, ponieważ musisz mieć taką samą liczbę praw i upadków, aby móc dotrzeć do rogu końcowego. Tak więc pomyślałem, że należy wykonać kolejną pętlę od lewej do prawej i zmienić dowolną liczbę elementów, aby uzyskać prawidłową ścieżkę. W tym przykładzie prawo - prawo - prawo - dół staje się w dół - w prawo - w prawo - w dół.
Ponadto zapomniałem, że nie liczę punktów, liczę krawędzie od lewego górnego rogu do prawego dolnego rogu.
Napisałem już jakiś kod, ale nie działa on wcale.
package projecteuler;
import java.util.ArrayList;
public class Projecteuler {
public static final int GRIDSIZE = 2;
public static void main(String[] args) {
ArrayList<boolean[]> paths = new ArrayList<>();
paths.add(new boolean[GRIDSIZE * 2]);
for(int i = 0; i < GRIDSIZE; i++) {
paths.get(0)[i] = true;
paths.get(0)[GRIDSIZE * 2 - 1 - i] = false;
}
boolean[] buf = paths.get(0).clone();
printArr(buf);
boolean tmp;
while(!checkTerminate(paths)) {
while(paths.contains(buf)) {
tmp = buf[buf.length - 1];
for(int i = buf.length - 1; buf[i - 1] != tmp && 0 < i; i--) {
buf[i] = !buf[i];
for(int j = 0; checkValid(buf) && j < i; j++)
buf[j] = !buf[j];
}
}
paths.add(buf.clone());
printArr(buf);
}
System.out.println(paths.size());
}
public static boolean checkTerminate(ArrayList<boolean[]> paths) {
boolean[] endPath = new boolean[GRIDSIZE * 2];
for(int i = 0; i < GRIDSIZE; i++) {
endPath[i] = false;
endPath[GRIDSIZE * 2 - 1 - i] = true;
}
return paths.contains(endPath);
}
public static boolean checkValid(boolean[] arr) {
int countR = 0,
countL = 0;
for(int i = 0; i < arr.length; i++)
if(arr[i])
countR++;
else
countL++;
return countR == countL;
}
public static void printArr(boolean[] arr) {
for(int i = 0; i < arr.length; i++)
System.out.print(arr[i] ? "right " : "down ");
System.out.println();
}
}
To nigdzie niczego nie zmienia.
right right down down
right right down down
right right down down
right right down down ...
i tak dalej jest wszystko, co wypuszcza. Wydaje się, że kod po prostu nie permutuje mojej ścieżki, ale też nie utknął w żadnej z pętli for. Domyślam się, że moje kryteria funkcji są umieszczone w niewłaściwej kolejności
Pomyślałem także o rozwiązaniu z cofaniem się, tak jak zrobiliśmy to w labiryncie dwa lata temu w szkole, ale chcę sprawdzić, czy to podejście jest w dowolnym miejscu lub nie przed powtórką wszystko.
EDIT:
postaram się wdrożyć obrazy przykładzie siatki 2 x 2 jak najszybciej, ale na stronie internetowej pod maintainance Projekt Euler jest w tej chwili.
Wreszcie kwestia programowania wyzwanie pokazujący rzeczywisty wysiłek, aby rozwiązać ten problem przed wysłaniem ... – meowgoesthedog
Pytanie jest bardzo słabo ** ** napisane. Mimo że dołożyłeś wszelkich starań, aby opublikować pytanie w Stack Overflow, tytuł posta i sposób, w jaki opisałeś problem, są absurdalne: nie powinieneś zakładać, że ludzie już znają pytanie, o którym mówisz . Zewnętrzne linki do prawdziwego pytania są po prostu niedopuszczalne. Edytuj wpis i podaj wszystkie niezbędne szczegóły w opisie tutaj, a także zmodyfikuj tytuł na coś, co właściwie opisuje prawdziwe pytanie. – progyammer
@meowgoesthedog dziękuję za uwagę moich wysiłków, ale jakoś ludzie wciąż obalają mój post. Być może moje podejście jest zbyt głupie, aby nawet zostać potraktowanym poważnie haha – LordScrat