Gå til innhold

Nodeproblemer (Array) 8-Puzzle


Anbefalte innlegg

Hei, prøver på nytt. Jeg har en 2x2 array som jeg prøver å utvide til en 3x3 array. Dette er et trestruktur.

Utskrifte skal være på formen

 

123

456

780

Det jeg ikke får til er ombyttingene inne i de mange firkant parantesene etter likhetstegnet.

Når jeg prøver å kjøre den utvidetekoden får jeg feilmeldingen

 

Exception in thread "main" java.lang.NullPointerException

at DataNode.DataNode.dump(DataNode.java:109)

at DataNode.Main.main(Main.java:28)

Java Result: 1

 

 

2x2 array utskrift er på formen

 

12

30

 

2x2 koden jeg prøver å utvide er:

 

class DataNode
{
   private int data[][];
   private DataNode barn[] = new DataNode[2]; // Max antall barn

   public DataNode(int start[][])
   {
       data = start;
   }

   public void lagBarn(int generations)
   {
       if (data[0][0] == 0) // forteller hvor 0 er i arrayet
       {
           int nyData1[][] = {{data[1][0],data[0][1]},{data[0][0],data[1][1]}};
           int nyData2[][] = {{data[0][1],data[0][0]},{data[1][0],data[1][1]}};
           barn[0] = new DataNode(nyData1);
           barn[1] = new DataNode(nyData2);
       }
       if (data[0][1] == 0)
       {
           int nyData1[][] = {{data[0][1],data[0][0]},{data[1][0],data[1][1]}};
           int nyData2[][] = {{data[0][0],data[1][1]},{data[1][0],data[0][1]}};
           barn[0] = new DataNode(nyData1);
           barn[1] = new DataNode(nyData2);
       }
       if (data[1][0] == 0)
       {
           int nyData1[][] = {{data[1][0],data[0][1]},{data[0][0],data[1][1]}};
           int nyData2[][] = {{data[0][0],data[0][1]},{data[1][1],data[1][0]}};
           barn[0] = new DataNode(nyData1);
           barn[1] = new DataNode(nyData2);
       }
       if (data[1][1] == 0)
       {
           int nyData1[][] = {{data[0][0],data[1][1]},{data[1][0],data[0][1]}};
           int nyData2[][] = {{data[0][0],data[0][1]},{data[1][1],data[1][0]}};
           barn[0] = new DataNode(nyData1);
           barn[1] = new DataNode(nyData2);
       }
       if (generations > 0)
           for (int i=0;i<barn.length;i++)
               barn[i].lagBarn(generations-1);
   } 
   public void dump()
   {
       for(int i=0;i<2;i++)
       {
           for(int j=0;j<2;j++)
               if (data[i][j] == 0)
                   System.out.print(" ");
               else
                  System.out.print(data[i][j]);
           System.out.println("");
       }
       System.out.println("");
       for(int i=0;i<barn.length;i++)
           if (barn [i] != null)
               barn[i].dump();
   }
   public static void main(String[] args) 
   {
       int data[][] = {{1,2},{3,0}};

       DataNode top = new DataNode(data);
       top.lagBarn(1);
       top.dump();
   }
}

 

Koden som jeg tror er riktig kommer jeg tilbake til. Etter som jeg har sjønt det er koden riktig utvidet,

men jeg får den ikke til å kjøre. Jeg fikk et tips om at jeg måtte utvide denne kodebiten med en forløkke eller var det en if-setning i den utvidete koden.

if (generations > 0)
           for (int i=0;i<barn.length;i++)
               barn[i].lagBarn(generations -1);

 

 

Den utvidete koden er som følger

class DataNode
{
   private int data[][];
   private DataNode barn[] = new DataNode[4]; // max antall barn
   private int[][] nyData3,nyData4;

   public DataNode(int start[][])
   {
       data = start;
   }

   public void lagBarn(int generations)
   {
       if (data[0][0] == 0)
       {
           int nyData1[][] = {{data[0][0],data[1][0],data[0][1]},{data[1][0],data[1][1],data[1][2]},{data[2][0],data[2]
2],data[2][2]}};
           int nyData2[][] = {{data[0][1],data[0][0],data[1][0]},{data[1][1],data[1][0],data[0][0]},{data[2][0],data[1]
1],data[2][1]}};
           barn[0] = new DataNode(nyData1);
           barn[1] = new DataNode(nyData2);

           System.out.print(nyData1);
       }
       if (data[0][1] == 0)
       {
           int nyData1[][] = {{data[0][0],data[0][0],data[0][0]},{data[0][0],data[0][0],data[0][0]},{data[0][0],data[0]
0],data[0][0]}};
           int nyData2[][] = {{data[0][0],data[0][0],data[0][0]},{data[0][0],data[0][0],data[0][0]},{data[0][0],data[0]
0],data[0][0]}};
           barn[0] = new DataNode(nyData1);
           barn[1] = new DataNode(nyData2);
           barn[2] = new DataNode(nyData3);
       }
       if (data[0][2] == 0)
       {
           int nyData1[][] = {{data[0][0],data[0][0],data[0][0]},{data[0][0],data[0][0],data[0][0]},{data[0][0],data[0]
0],data[0][0]}};
           int nyData2[][] = {{data[0][0],data[0][0],data[0][0]},{data[0][0],data[0][0],data[0][0]},{data[0][0],data[0]
0],data[0][0]}};
           barn[0] = new DataNode(nyData1);
           barn[1] = new DataNode(nyData2);
       }
       if (data[1][0] == 0)
       {
           int nyData1[][] = {{data[0][0],data[0][0],data[0][0]},{data[0][0],data[0][0],data[0][0]},{data[0][0],data[0]
0],data[0][0]}};
           int nyData2[][] = {{data[0][0],data[0][0],data[0][0]},{data[0][0],data[0][0],data[0][0]},{data[0][0],data[0]
0],data[0][0]}};
           barn[0] = new DataNode(nyData1);
           barn[1] = new DataNode(nyData2);
           barn[2] = new DataNode(nyData3);
       }
if (data[1][1] == 0)
       {
           int nyData1[][] = {{data[0][0],data[0][0],data[0][0]},{data[0][0],data[0][0],data[0][0]},{data[0][0],data[0]
0],data[0][0]}};
           int nyData2[][] = {{data[0][0],data[0][0],data[0][0]},{data[0][0],data[0][0],data[0][0]},{data[0][0],data[0]
0],data[0][0]}};
           barn[0] = new DataNode(nyData1);
           barn[1] = new DataNode(nyData2);
           barn[2] = new DataNode(nyData3);
           barn[3] = new DataNode(nyData4);
       }
       if (data[1][2] == 0)
       {
           int nyData1[][] = {{data[0][0],data[0][0],data[0][0]},{data[0][0],data[0][0],data[0][0]},{data[0][0],data[0]
0],data[0][0]}};
           int nyData2[][] = {{data[0][0],data[0][0],data[0][0]},{data[0][0],data[0][0],data[0][0]},{data[0][0],data[0]
0],data[0][0]}};
           barn[0] = new DataNode(nyData1);
           barn[1] = new DataNode(nyData2);
       }
       if (data[2][0] == 0)
       {
           int nyData1[][] = {{data[0][0],data[0][0],data[0][0]},{data[0][0],data[0][0],data[0][0]},{data[0][0],data[0]
0],data[0][0]}};
           int nyData2[][] = {{data[0][0],data[0][0],data[0][0]},{data[0][0],data[0][0],data[0][0]},{data[0][0],data[0]
0],data[0][0]}};
           barn[0] = new DataNode(nyData1);
           barn[1] = new DataNode(nyData2);
       }
       if (data[2][1] == 0)
       {
           int nyData1[][] = {{data[0][0],data[0][0],data[0][0]},{data[0][0],data[0][0],data[0][0]},{data[0][0],data[0]
0],data[0][0]}};
           int nyData2[][] = {{data[0][0],data[0][0],data[0][0]},{data[0][0],data[0][0],data[0][0]},{data[0][0],data[0]
0],data[0][0]}};
           barn[0] = new DataNode(nyData1);
           barn[1] = new DataNode(nyData2);
           barn[2] = new DataNode(nyData3);
       }
if (data[2][2] == 0)
       {
           int nyData1[][] = {{data[2][1],data[1][0],data[0][2]},{data[2][2],data[2][1],data[1][0]},{data[2][2],data[1]
2],data[0][2]}};
           int nyData2[][] = {{data[2][1],data[1][0],data[0][2]},{data[2][2],data[2][1],data[1][0]},{data[2][2],data[1]
2],data[0][2]}};
           barn[0] = new DataNode(nyData1);
           barn[1] = new DataNode(nyData2);
       }
       if (generations > 0)
           for (int i=0;i<barn.length;i++)
               barn[i].lagBarn(generations -1);
                   for(int i=0;i<barn.length;i++)

   }

   public void dump()
   {
        for(int i=0;i<3;i++)
       {
          for(int j=0;j<3;j++)
               if (data[i][j] == 0)
                   System.out.print(" ");
               else
                  System.out.print(data[i][j]);
           System.out.println("");

       }
       System.out.println("");
       for(int i=0;i<barn.length;i++)
           if (barn [i] != null)
               barn[i].dump();   
   }
   public static void main(String[] args) 
   {

       int[][] a = { { 1, 2, 3 },{ 4, 5, 6 },{7, 8, 0 }};

       DataNode top = new DataNode(data);
       top.lagBarn(1);
       top.dump();
   }
}

Lenke til kommentar
Videoannonse
Annonse
Jeg har en 2x2 array som jeg prøver å utvide til en 3x3 array.
Siden arrays i Java er immutable (kan ikke endre på strukturen), så må du lage nye arrayer og kopiere over verdiene.
Utskrifte skal være på formen

 

123

456

780

 

2x2 array utskrift er på formen

 

12

30

Skal du kopiere over alle dataene du har i original-arrayet slik at de beholder rekkefølgen og deretter legge til tallene fra 4 til 8?

 

Jeg forstår ikke helt hvordan dette relaterer seg til 8-puzzle. Men du må ihvertfall lage en int[3][3] tmp ..., kopiere over alle dataene du vil og sette data = tmp;

Lenke til kommentar
Jeg har en 2x2 array som jeg prøver å utvide til en 3x3 array.
Siden arrays i Java er immutable (kan ikke endre på strukturen), så må du lage nye arrayer og kopiere over verdiene.
Utskrifte skal være på formen

 

123

456

780

 

2x2 array utskrift er på formen

 

12

30

Skal du kopiere over alle dataene du har i original-arrayet slik at de beholder rekkefølgen og deretter legge til tallene fra 4 til 8?

 

Jeg forstår ikke helt hvordan dette relaterer seg til 8-puzzle. Men du må ihvertfall lage en int[3][3] tmp ..., kopiere over alle dataene du vil og sette data = tmp;

 

Dataene skal ikke kopieres,man å sette inn nye verdier(0 TIL 2).

 

 

     0    1    2
  _____________
0  |0-0|0-1|0-2|
  |___|___|___|
1  |1-0|1-1|1-2|
  |___|___|___|
2  |2-0|2-1|2-2|
  |___|___|___|

Ovenfor ser du plasseringen av verdiene i tabellen. Det er disse verdiene som må stokkes om slik at vi kan kjøre koden uten kompilerings feil.(NullPointerException)

eks. if (data[0][0] == 0) dette er posisjon 0-0

Jeg kan ikke forklare på en annen måte fordi jeg ikke kan programmerings språket enda(terminologien). Håper at tabellen ser nogenlunde fårståelig ut når jeg poster dette.

Lenke til kommentar
Exception in thread "main" java.lang.NullPointerException

at DataNode.DataNode.dump(DataNode.java:109)

at DataNode.Main.main(Main.java:28)

Java Result: 1

Når du får ut en feilmelding så bør du sjekke den linja som står oppgitt. Hvis det er denne linja:

if (data[i][j] == 0) {

så betyr feilmeldingen at data-arrayen din er null, det vil si at det ikke er en array, bare en tom peker. Hvorfor du får denne feilmeldingen vet jeg ikke, du får den iallfall ikke direkte av den koden du la ut. I den koden du la ut får man mange feil. For det første får du feil i:

DataNode top = new DataNode(data);

ettersom du prøver å aksessere (bruke) variabelen "data" som ikke er statisk, så her skulle det stått:

DataNode top = new DataNode(a);

Videre får iallfall jeg en bunch av feil siden du lager alle arrayene dine slik:

int nyData2[][] = {{data[2][1],data[1][0],data[0][2]},{data[2][2],data[2][1],data[1][0]},{data[2][2],data[1]2],data[0][2]}};

(merk [1]2]) men dette er kanskje en feil grunnet kopieringen?

 

Uansett, videre er det jo opplagt noe galt i denne delen av koden:

if (generations > 0)
	for (int i=0;i<barn.length;i++)
			barn[i].lagBarn(generations -1);
					for(int i=0;i<barn.length;i++)
}

og dersom du fjerner den ekstra "for(int i=0;i<barn.length;i++)" vil du få feil siden "barn[2]" er "null" ettersom du i koden:

		if (data[2][2] == 0) {
		int nyData1[][] = {{data[2][1],data[1][0],data[0][2]},
						   {data[2][2],data[2][1],data[1][0]},
						   {data[2][2],data[1][2],data[0][2]}};
		int nyData2[][] = {{data[2][1],data[1][0],data[0][2]},
						   {data[2][2],data[2][1],data[1][0]},
						   {data[2][2],data[1][2],data[0][2]}};
		barn[0] = new DataNode(nyData1);
		barn[1] = new DataNode(nyData2);
	}

ikke tilordner (setter lik) "barn[2]".

 

Så det er endel feil og du får videre feil dersom du endrer det over. Men for at det skal være mulig å hjelpe deg må jeg / vi skjønne hva du faktisk vil. Det eneste jeg tror jeg forstår er at du har et program som gjør etter eller annet med en 2x2-array og du har lyst til å lage et program som gjør noe av det samme med en 3x3-array, sant? Og du skal omordne elementene i 3x3-arrayen, sant? Det jeg ikke forstår er hvordan du ønsker at omordningen skal skjer. Det jeg heller ikke forstår er hva som egentlig er poenget, men det er ikke så farlig dersom du er helt presis på hva du ønsker skal skje.

Lenke til kommentar
Exception in thread "main" java.lang.NullPointerException

at DataNode.DataNode.dump(DataNode.java:109)

at DataNode.Main.main(Main.java:28)

Java Result: 1

Når du får ut en feilmelding så bør du sjekke den linja som står oppgitt. Hvis det er denne linja:

if (data[i][j] == 0) {

så betyr feilmeldingen at data-arrayen din er null, det vil si at det ikke er en array, bare en tom peker. Hvorfor du får denne feilmeldingen vet jeg ikke, du får den iallfall ikke direkte av den koden du la ut. I den koden du la ut får man mange feil. For det første får du feil i:

DataNode top = new DataNode(data);

ettersom du prøver å aksessere (bruke) variabelen "data" som ikke er statisk, så her skulle det stått:

DataNode top = new DataNode(a);

Videre får iallfall jeg en bunch av feil siden du lager alle arrayene dine slik:

int nyData2[][] = {{data[2][1],data[1][0],data[0][2]},{data[2][2],data[2][1],data[1][0]},{data[2][2],data[1]2],data[0][2]}};

(merk [1]2]) men dette er kanskje en feil grunnet kopieringen?

 

Uansett, videre er det jo opplagt noe galt i denne delen av koden:

if (generations > 0)
	for (int i=0;i<barn.length;i++)
			barn[i].lagBarn(generations -1);
					for(int i=0;i<barn.length;i++)
}

og dersom du fjerner den ekstra "for(int i=0;i<barn.length;i++)" vil du få feil siden "barn[2]" er "null" ettersom du i koden:

		if (data[2][2] == 0) {
		int nyData1[][] = {{data[2][1],data[1][0],data[0][2]},
						   {data[2][2],data[2][1],data[1][0]},
						   {data[2][2],data[1][2],data[0][2]}};
		int nyData2[][] = {{data[2][1],data[1][0],data[0][2]},
						   {data[2][2],data[2][1],data[1][0]},
						   {data[2][2],data[1][2],data[0][2]}};
		barn[0] = new DataNode(nyData1);
		barn[1] = new DataNode(nyData2);
	}

ikke tilordner (setter lik) "barn[2]".

 

Så det er endel feil og du får videre feil dersom du endrer det over. Men for at det skal være mulig å hjelpe deg må jeg / vi skjønne hva du faktisk vil. Det eneste jeg tror jeg forstår er at du har et program som gjør etter eller annet med en 2x2-array og du har lyst til å lage et program som gjør noe av det samme med en 3x3-array, sant? Og du skal omordne elementene i 3x3-arrayen, sant? Det jeg ikke forstår er hvordan du ønsker at omordningen skal skjer. Det jeg heller ikke forstår er hva som egentlig er poenget, men det er ikke så farlig dersom du er helt presis på hva du ønsker skal skje.

 

Kodebiten "(merk [1]2])" er bare kopieringsfeil, finner den ikke i kodenbiten du sikter til.

 

Klart denne biten må endres, men jeg vet ikke hvordan

if (generations > 0)
	for (int i=0;i<barn.length;i++)
			barn[i].lagBarn(generations -1);
					for(int i=0;i<barn.length;i++)
}

 

Når det gjelder feilmeldinger skjønner jeg ikke noe av det samme hvor det skulle peke hen.

 

Koden skal kunne skrive ut en 3x3 array akkurat som om det skulle vært en 8-puzzle.

Jeg tror jeg må gi opp prosjektet uten at den blir løst. Å det er jo en skam. Det ser ikke ut til at noen skjønner hva jeg mener. Jeg var litt for ambesiøs.

Lenke til kommentar
Exception in thread "main" java.lang.NullPointerException

at DataNode.DataNode.dump(DataNode.java:109)

at DataNode.Main.main(Main.java:28)

Java Result: 1

Når du får ut en feilmelding så bør du sjekke den linja som står oppgitt. Hvis det er denne linja:

{{data[2][1],data[1][0],data[0][2]},

{data[2][2],data[2][1],data[1][0]},

{data[2][2],data[1][2],data[0][2]}};

 

Det er nok ikke bare denne delen som bør endres. Promblemet er jo at jeg ikke kan det.

Lenke til kommentar
Når det gjelder feilmeldinger skjønner jeg ikke noe av det samme hvor det skulle peke hen.

NullPointerException betyr her at arrayen ikke er opprettet (så det er egentlig ikke en array ennå), det er bare en peker på "null".

 

Jeg glemte å si at verdiene inne i firkantparantesene IKKE er rett plassert. Jeg bare prøver meg frem uten å lykkes.

Det er jo opplagt, men det er mange andre feil, og det er disse som gjør at koden ikke kjøres.

 

Det er nok ikke bare denne delen som bør endres. Promblemet er jo at jeg ikke kan det.

Det kan være lurt å starte på et mye mer grunnleggende nivå og arbeide seg oppover. Dersom du insisterer på å løse dette problemet nå må du tenke at du trenger å lære deg mer generelle ting samtidig, altså må du uansett lese litt generelt utenom. Et greit sted å starte da er å lese såpass at du forstå hva som er feil i den kodebiten du sikter til:

if (generations > 0)
	for (int i=0;i<barn.length;i++)
			barn[i].lagBarn(generations -1);
					for(int i=0;i<barn.length;i++)
}

Lenke til kommentar
Når det gjelder feilmeldinger skjønner jeg ikke noe av det samme hvor det skulle peke hen.

NullPointerException betyr her at arrayen ikke er opprettet (så det er egentlig ikke en array ennå), det er bare en peker på "null".

 

Jeg glemte å si at verdiene inne i firkantparantesene IKKE er rett plassert. Jeg bare prøver meg frem uten å lykkes.

Det er jo opplagt, men det er mange andre feil, og det er disse som gjør at koden ikke kjøres.

 

Det er nok ikke bare denne delen som bør endres. Promblemet er jo at jeg ikke kan det.

Det kan være lurt å starte på et mye mer grunnleggende nivå og arbeide seg oppover. Dersom du insisterer på å løse dette problemet nå må du tenke at du trenger å lære deg mer generelle ting samtidig, altså må du uansett lese litt generelt utenom. Et greit sted å starte da er å lese såpass at du forstå hva som er feil i den kodebiten du sikter til:

if (generations > 0)
	 for (int i=0;i<barn.length;i++)
			 barn[i].lagBarn(generations -1);
					 for(int i=0;i<barn.length;i++)
}

Klart kodebiten var feil. Den siste forløkka skulle jo ikke vært med.

Lenke til kommentar
Koden skal kunne skrive ut en 3x3 array akkurat som om det skulle vært en 8-puzzle.

Jeg tror jeg må gi opp prosjektet uten at den blir løst. Å det er jo en skam. Det ser ikke ut til at noen skjønner hva jeg mener. Jeg var litt for ambesiøs.

En ting er at du er for ambisiøs, en annen ting er ingen forstår hva problemet ditt er. Hva er ditt overliggende mål? Å løse 8-puzzle?

 

For den setningen «Koden skal kunne skrive ut en 3x3 array akkurat som om det skulle vært en 8-puzzle.» virker litt merkelig. Jeg har jo gitt kode for akkurat det to ganger tidligere til deg.

Lenke til kommentar
Koden skal kunne skrive ut en 3x3 array akkurat som om det skulle vært en 8-puzzle.

Jeg tror jeg må gi opp prosjektet uten at den blir løst. Å det er jo en skam. Det ser ikke ut til at noen skjønner hva jeg mener. Jeg var litt for ambesiøs.

En ting er at du er for ambisiøs, en annen ting er ingen forstår hva problemet ditt er. Hva er ditt overliggende mål? Å løse 8-puzzle?

 

For den setningen «Koden skal kunne skrive ut en 3x3 array akkurat som om det skulle vært en 8-puzzle.» virker litt merkelig. Jeg har jo gitt kode for akkurat det to ganger tidligere til deg.

 

Jer ser at du har fått en nøtt å knekke her. Koden du sikter til gir bare utskrift av det du setter inn i denne kodebiten, og i den rekkefølgen verdiene er satt inn.

int data[][] = { { 1, 2, 3 },{ 4, 5, 6 },{7, 8, 0 }};

og kunn den ene skriften. Som jeg skrev, så skal den gi en utskrift på minst 9 utskrift, men som regel gir dem minst det dobbelte. Som jeg også skrev ligner utskriften på et 8-puzzle brett.

Jeg poster under utskriften av en 2x2 array slik at det kankje gir deg hint om hva jeg mener.

 

init:
deps-jar:
compile:
run:
12
3 

1 
32

1
32

12
3 

12
3

2
13

12
3 

BUILD SUCCESSFUL (total time: 0 seconds)

Den utskriften ovenfor har kodebiten som ser slik ut

 

int data[][] = { { 1,2},{3,0 }}

 

Håper dette hjelper

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...