Avatar billede alexander_j Nybegynder
14. februar 2004 - 13:51 Der er 14 kommentarer og
1 løsning

map-array ballade

Her er er kort af en slags gemt i et array:
map=new Array(
    [1,1,1,1,1,1,1,1],
    [1,0,0,1,0,0,0,1],
    [1,0,0,1,0,0,0,1],
    [1,1,1,1,0,0,0,1],
    [1,0,0,0,0,0,0,1],
    [1,0,0,0,0,0,0,1],
    [1,0,0,0,0,0,0,1],
    [1,1,1,1,1,1,1,1]
);
Til at gennemgå de enkelte punkter på kortet bruger jeg:
for(i=0;i<map.length;i++){
    for(j=0;j<map[i].length;j++){
        if(map[i][j]==0){
            ???map[i][j]???:
        }
    }
}

Kortets nuller ovenfor kan deles i to dele af ettallerne(to kasser), men jeg savner en metode til at dele kortet, fx så nullerne i den lille kasse vliver til tretaller og i den store kasse bliver til firtaller.

Nogen der kan knække den?
Avatar billede alexander_j Nybegynder
15. februar 2004 - 16:40 #1
map=new Array(
    [1,1,1,1,1,1,1,1],
    [1,0,0,1,0,0,0,1],
    [1,0,0,1,0,0,0,1],
    [1,1,1,1,0,0,0,1],
    [1,0,0,0,0,0,0,1],
    [1,0,0,0,0,0,0,1],
    [1,0,0,0,0,0,0,1],
    [1,1,1,1,1,1,1,1]
);

function tjek(x,y){
    myarray[y][x]=-1;
    if(myarray[y][x-1]!=-1 and myarray[y][x-1]!=1 and myarray[y][x-1]!=undefined) tjek(x-1,y);
    if(myarray[y][x+1]!=-1 and myarray[y][x+1]!=1 and myarray[y][x+1]!=undefined) tjek(x+1,y);
    if(myarray[y-1][x]!=-1 and myarray[y-1][x]!=1 and myarray[y-1][x]!=undefined) tjek(x,y-1);
    if(myarray[y+1][x]!=-1 and myarray[y+1][x]!=1 and myarray[y+1][x]!=undefined) tjek(x,y+1);
}
function findbox(){
    myarray=new Array();
    temp=undefined;
    for(i=0;i<map.length;i++){
        myarray.push([]);
        for(j=0;j<map[i].length;j++){
            myarray[i][j]=map[i][j];
        }
    }
    tjek(1,1);
    for(i=0;i<map.length;i++){
        for(j=0;j<map[i].length;j++){
            if(myarray[i][j]==0) map[i][j]=1;
        }
    }
    for(i=0;i<myarray.length;i++){
        trace(map[i]);
    }
}
findbox();

hmm... det her virker for så vidt fint, men hvis 'map' bliver en smule større, så kommer der en fejlmedelelse:
'256 levels of recursion were exceeded in one action list.
This is probably an infinite loop.
Further execution of actions has been disabled in this movie.'

Er der en måde man kan tvinge flash til at gå videre trods 256 levels of recursion were exceeded?
Avatar billede alexander_j Nybegynder
15. februar 2004 - 16:51 #2
Allerede ved mapstørreser af denne størrelse:
map=new Array(
    [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],
    [1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
    [1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
    [1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
    [1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
    [1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
    [1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
    [1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
    [1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
    [1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
    [1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
    [1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
    [1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
    [1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
    [1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
    [1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
    [1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
    [1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
    [1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
    [1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
    [1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
    [1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
    [1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
    [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
);

function tjek(x,y){
    myarray[y][x]=-1;
    if(myarray[y][x-1]!=-1 and myarray[y][x-1]!=1 and myarray[y][x-1]!=undefined) tjek(x-1,y);
    if(myarray[y][x+1]!=-1 and myarray[y][x+1]!=1 and myarray[y][x+1]!=undefined) tjek(x+1,y);
    if(myarray[y-1][x]!=-1 and myarray[y-1][x]!=1 and myarray[y-1][x]!=undefined) tjek(x,y-1);
    if(myarray[y+1][x]!=-1 and myarray[y+1][x]!=1 and myarray[y+1][x]!=undefined) tjek(x,y+1);
}
function findbox(){
    myarray=new Array();
    temp=undefined;
    for(i=0;i<map.length;i++){
        myarray.push([]);
        for(j=0;j<map[i].length;j++){
            myarray[i][j]=map[i][j];
        }
    }
    tjek(10,10);
    for(i=0;i<map.length;i++){
        for(j=0;j<map[i].length;j++){
            if(myarray[i][j]==0) map[i][j]=1;
        }
    }
    for(i=0;i<myarray.length;i++){
        trace(map[i]);
    }
}
findbox();
Avatar billede barklund Nybegynder
15. februar 2004 - 17:30 #3
´Jeg kigger på det - det lyder sjovt og jeg har engang lavet noget tilsvarende... At finde felter af samme værdi i et grid.
Avatar billede alexander_j Nybegynder
15. februar 2004 - 17:39 #4
Synes ellers min løsning var genial, men lidt problematisk at kommer over den 256 grænse - måske jeg skulle sørge for den ikke søgte på det felt den kom fra!
Men hvis du kan finde en løsning vil jeg være taknemmelig - jeg sidder nemlig og river mig lidt i håret over det, da der da må være en eller anden matematisk måde at gribe det an!
Avatar billede bootlab Nybegynder
16. februar 2004 - 00:44 #5
Jeg følger lige med hvad der sker :)
Avatar billede barklund Nybegynder
19. februar 2004 - 01:05 #6
Hm, kan ikke lige komme på en fornuftig algoritme her så sent...

Men i flash7 playeren er der kommet en "hemmelig" (= kan ikke scriptet fra IDE'en) instruktion til at hæve grænsen for antal lovlige rekursioner:

http://forum.codeazur.com/viewtopic.php?t=260
Avatar billede alexander_j Nybegynder
19. februar 2004 - 14:24 #7
;-) helt iorden - men hvis du får tid og kan gennemskue den på et senere tidspunkt må du meget gerne melde tilbage - i mellemtiden prøver jeg med at slå lovlige rekursioner fra!
Avatar billede barklund Nybegynder
22. februar 2004 - 17:19 #8
Okay, det virker nu :)

Jeg lavede map-strukturen om, så man kun har 1 dimension, men husker længden.

Altså mit:

map = [1,0,0,1,0,0,1,0,1];
map_length = 3;

Er det samme som dit:

map[[1,0,0],[1,0,0],[1,0,1]];

Det er blot hurtigere at søge i...

Funktionen tjek(a, x, l, r, c) søger igennem et map, a,  med map_length l udfra positionen x (endimensionel) efter positionerne i nærheden med værdien r som den laver om til c.

findBox søger så efter alle 0'er og starter tjek herudfra... Den opdaterer internt sin map_color til hvert nyt felt...

Den er pæææænt hurtig, synes jeg selv :)

Den ligger her: http://actionscript.dk/eksperten/maparray/

// Morten Barklund
// DKMMUG Manager - http://dkmmug.dk
Avatar billede alexander_j Nybegynder
26. februar 2004 - 11:04 #9
Det lyder godt, kan du have .fla'en liggende til på lørdag? - jeg kommer nemlig først hjem fra ferie fredag aften!
Avatar billede barklund Nybegynder
26. februar 2004 - 11:28 #10
Det kan du tro :)
Avatar billede alexander_j Nybegynder
28. februar 2004 - 00:33 #11
Det ser rigtig godt ud og det virker jo!
Læg et svar, så du kan få dine velfortjente point :-)

Men jeg har skisme ikke gennemskuet hele koden pt. - blandt andet er der lidt kode jeg ikke forstår:
1. var to_search=[x] - hvad gør '[' og ']' i den sammenhæng?
1½. other = [] - hvad gør '[' og ']' i den sammenhæng?
2. var i=map_color=2;
  for(i=0;i<some..... - hvorfor skal 'i' så sættes til samme værdi som 'map_color'?
3. hvad gør funktionen 'pushIfNotExists'?
Avatar billede barklund Nybegynder
28. februar 2004 - 02:10 #12
1. var to_search = new Array(x);
1½. other = new Array();
2. var i, map_color = 2;
3. 'pushIfNotExists' - som navnet antyder - lav kun push() hvis værdien ikke findes i array'et i forvejen.
Avatar billede alexander_j Nybegynder
28. februar 2004 - 08:19 #13
Great ;-)
Avatar billede barklund Nybegynder
28. februar 2004 - 11:32 #14
Og det er så lidt løgn... Det rigtige er:

var to_search = new Array();
to_search[0] = x;

Er jo ikke det samme som:

var to_search = new Array(x);

Hvis x er et tal. Så får man jo bare et array, der er initialiseret med x tomme pladser.

Men initArray-konstruktoren er også ret smart:

var mit_array= [1,2,3], tomt_array = [];

// Morten Barklund
Avatar billede barklund Nybegynder
28. februar 2004 - 12:51 #15
Og tak for points ;)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester