Programim dhe zhvillim, javascript, python, php, html

Miu në një labirint duke përdorur Stack (Java)

Na jepet një grup karakteresh 2D dhe, duke u nisur nga një pikë e caktuar, duhet të gjejmë një 'dalje', e cila është një '0' në perimetrin e matricës së dhënë. Programi kthehet i vërtetë nëse gjendet një shteg, i cili do të printojë një mesazh kur ta ekzekutoj në metodën time kryesore më vonë. Mund të lëvizim vetëm lart, majtas, poshtë ose djathtas në një '0' të afërt. Tashmë jam përpjekur ta bëj këtë punë, megjithatë kam një gabim memorie, që ndoshta do të thotë se jam mbërthyer në një lak të pafund. Unë jam përpjekur ta zbatoj këtë projekt duke përdorur një Stack që kam bërë duke përdorur Nodes, të cilin e kam zbatuar edhe vetë duke përdorur gjenerikë, si kjo: p.sh.

StringStackImpl<int[][]> s = new StringStackImpl<>(); 

në një skedar tjetër .java. Këto funksionojnë mirë. Unë u përpoqa të ruaj koordinatat e një karakteri në matricë si kjo:

StringStackImpl<int[]> s = new StringStackImpl<>();
s.push(new int[]{i, j});

Këtu është kodi im:

    private static boolean hasExit(char[][] maze, int n, int m, int i, int j) {
    int d = -1;
    boolean[][] visited = new boolean[n][m];
    for (int a = 0; a < visited.length; a++) {
        for (int b = 0; b < (visited[a]).length; b++) {
            visited[a][b] = false;
        }
    }
    StringStackImpl<int[]> s = new StringStackImpl<>();
    s.push(new int[]{i, j});
    while (!(s.isEmpty())) {
        int[] temp = s.peek();
        d += 1;
        i = temp[0];
        j = temp[1];
        if (((i == 0) || (i == n-1) || (j == 0) || (j == m-1)) && (maze[i][j] == '0')) {
            return true;
        }
        if (d == 0) {
            if ((i-1 >= 0) && (maze[i-1][j] == '0') && !(visited[i-1][j])) {
                visited[i-1][j] = true;
                s.push(new int[]{i-1, j});
                d = -1;
            }
        }
        else if (d == 1) {
            if ((j-1 >= 0) && (maze[i][j-1] == '0') && !(visited[i][j-1])) {
                visited[i][j-1] = true;
                s.push(new int[]{i, j-1});
                d = -1;
            }
        }
        else if (d == 2) {
            if ((i+1 < n) && (maze[i+1][j] == '0') && !(visited[i+1][j])) {
                visited[i+1][j] = true;
                s.push(new int[]{i+1, j});
                d = -1;
            }
        }
        else if (d == 3) {
            if ((j+1 < m) && (maze[i][j+1] == '0') && !(visited[i][j+1])) {
                visited[i][j+1] = true;
                s.push(new int[]{i, j+1});
                d = -1;
            }
        }
        else {
            s.pop();
            d = -1;
        }
    }
    return false;
}

}

EDIT: Punon tani, falë kendavidson! ‹3


  • Së pari, e gjithë kthimi i vizituar = i vërtetë (që në fakt është i rremë) më ngatërroi, nëse vizitohet diçka, nuk dëshironi të shkoni atje, që do të thotë që ndoshta duhet të ndryshoni inicializimin e visited[][] = false; duke e vendosur atë true kur të shkoni atje. Rikthimi në një vend të vizituar është në rregull, por ju nuk dëshironi ta rivendosni atë në të pavizituar, pasi nëse algoritmi po funksionon, duhet të dini se i keni shteruar të gjitha rrugët në atë rrugë. Për shkak se po ri-aktivizoni rrugën e hapur, po shkoni vazhdimisht në të njëjtat shtigje. 18.11.2019
  • Pra, çfarë saktësisht duhet të ndryshoj në kodin tim, përveç të gjithë situatës së vërtetë-false? 18.11.2019
  • Komentoni ose hiqni visitied[i][j] = true; nga klauzola juaj e fundit else{ }. d = -1 duhet të jetë në rregull atje, pasi ju dëshironi të vazhdoni të njëjtin proces përzgjedhjeje s/w/n/e. 18.11.2019
  • Kam ngarkuar versionin e ri, siç thatë, por, tani, ai kthehet false, sepse nuk mund ta gjejë rrugën. Cili është gabimi im tani? 18.11.2019
  • Pa parë labirintin/pikën e fillimit është e vështirë të ecësh nëpër të. Por të paktën duhet të jeni në gjendje ta korrigjoni atë në këtë pikë dhe të ndiqni shtegun pa e pyetur veten pse po rigjurroni hapat. 18.11.2019
  • Në fakt, ju ndryshuat visited[][] = false që do të thotë se tani duhet t'i ndryshoni të gjitha nëse-të tuaja në && !visitied[][] në mënyrë që ata të ndjekin rrugën. 18.11.2019

Përgjigjet:


1

Në shikim të parë, dhe duke ju besuar në lidhje me StringStackImpl, unë mendoj se duhet të përdorni vetëm d = -1;else të fundit. Tani për tani ju gjithmonë po e ktheni atë në -1, dhe kështu kontrolloni vetëm kushtin d == 0. Nga sa kuptova, d a është i mundur drejtimi, dhe kështu duhet të shkojë nga 03?

Përveç kësaj, merrni pak kohë për t'u dhënë emra kuptimplotë variablave tuaj: visited[i][j] është e vërtetë kur nyja [i][j] nuk është vizituar ende... Kjo është kundërintuitive dhe nuk i ndihmon të tjerët, apo veten, të kuptojnë kodin tuaj.

A jeni i detyruar të përdorni char për i dhe j? Me të vërtetë tenton ta bëjë kodin të gjatë dhe të lodhshëm për asgjë.

18.11.2019
  • Po, keni të drejtë për numrin e plotë d dhe për emrat gjithashtu. Unë nuk pashë asnjë mënyrë rreth tij, prandaj përdora char[] për i dhe j (të njëjtin lloj të dhënash si personazhet në labirint). 18.11.2019
  • Përdorimi i d = -1 vetëm në të fundit tjetër nuk e zgjidh problemin. Problemi mund të ketë të bëjë me tempin që është gjithmonë ai fillestar në çdo lak. 18.11.2019
  • Epo, nuk keni pse të shikoni 4 herë të njëjtën nyje. Mund ta shikoni një herë dhe të bëni të gjithë logjikën për drejtimin 4, pa rritur një ndryshore. Nuk jam 100% i sigurt, por mendoj se kudo që përdorni i dhe j është si int. Puna është se i dhe j nuk janë char[], ato janë përsëritës mbi grup. 18.11.2019
  • Materiale të reja

    Masterclass Coroutines: Kapitulli-3: Anulimi i korutinave dhe trajtimi i përjashtimeve.
    Mirë se vini në udhëzuesin gjithëpërfshirës mbi Kotlin Coroutines! Në këtë seri artikujsh, unë do t'ju çoj në një udhëtim magjepsës, duke filluar nga bazat dhe gradualisht duke u thelluar në..

    Faketojeni derisa ta arrini me të dhënat false
    A e gjeni ndonjëherë veten duke ndërtuar një aplikacion të ri dhe keni nevojë për të dhëna testimi që duken dhe duken më realiste ose një grup i madh të dhënash për performancën e ngarkesës...

    Si të përdorni kërkesën API në Python
    Kërkesë API në GitHub për të marrë depot e përdoruesve duke përdorur Python. Në këtë artikull, unë shpjegoj procesin hap pas hapi për të trajtuar një kërkesë API për të marrë të dhëna nga..

    Një udhëzues hap pas hapi për të zotëruar React
    Në këtë artikull, do të mësoni se si të krijoni aplikacionin React, do të mësoni se si funksionon React dhe konceptet thelbësore që duhet të dini për të ndërtuar aplikacione React. Learning..

    AI dhe Psikologjia — Pjesa 2
    Në pjesën 2 të serisë sonë të AI dhe Psikologji ne diskutojmë se si makineritë mbledhin dhe përpunojnë të dhëna për të mësuar emocione dhe ndjenja të ndryshme në mendjen e njeriut, duke ndihmuar..

    Esencialet e punës ditore të kodit tim VS
    Shtesat e mia të preferuara - Git Graph 💹 Kjo shtesë është vërtet e mahnitshme, e përdor përpara se të filloj të punoj për të kontrolluar dy herë ndryshimet dhe degët më të fundit, mund të..

    Pse Python? Zbulimi i fuqisë së gjithanshme të një gjiganti programues
    Në peizazhin gjithnjë në zhvillim të gjuhëve të programimit, Python është shfaqur si një forcë dominuese. Rritja e tij meteorike nuk është rastësi. Joshja e Python qëndron në thjeshtësinë,..