Random-walk auf 10 x 10 Array
ich habe ein problem, herauszufinden, einen Algorithmus für dieses problem,versuchen seit einigen Tagen ohne Erfolg,hier ist ein pic von dem, was im, der versucht zu erhalten:
http://i.stack.imgur.com/X70nX.png
Hier ist mein code habe versucht, viele verschiedene Lösungen, aber immer stecken an der gleichen Stelle:(Sorry für die gemischte Sprache ist der wichtige Teil in Englisch)
ps
im nicht benutzen soll-Funktionen, um dieses problem zu lösen, nur Schleifen und Arrays.
BEARBEITEN
nach viel zu fixieren, tut der Fuss aber sehr selten Abstürze
irgendeine Idee?
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void){
char box[10][10];
int i,j;
int move,row,col;
char letter='A';
srand(time(NULL));
printf("\n\tSTART\n\n");
for(i=0;i < 10 ;i++)/* righe */
{
for(j=0;j < 10;j++) /* colonne */
{
box[i][j] = '.'; /* assegno . a tutti gli elementi dell array */
if(j == 9)
printf("%c%c\n", box[i][j]); /* giustifico ogni 10 elementi dell array j(0-9) */
else
printf("%c%c", box[i][j]);
}
}
/* LETS START */
printf("\n\n Inizia il gioco\n\n");
/* random place to start */
row = rand() % 9;
col = rand() % 9;
box[row][col]= 'A';
while(letter <= 'Z')
{
if(box[row+1][col] == '.' || box[row-1][col] == '.' || box[row][col+1] == '.' || box[row][col-1] == '.' )
{
move=rand() % 4;
switch(move){
case 0: /* Going UP */
if((row != 0) && (box[row-1][col] == '.'))
{
box[row-1][col]=++letter;
box[row--][col];
}else{
move=rand() % 4;
}
case 1:/* Going Down */
if((row != 9) && (box[row+1][col] == '.'))
{
box[row+1][col]=++letter;
box[row++][col];
}else{
move=rand() % 4;
}
case 2: /*Going Left */
if((col != 0) && (box[row][col-1] == '.'))
{
box[row][col-1]=++letter;
box[row][col--];
}else{
move=rand() % 4;
}
case 3: /* Going Right */
if((col != 9) && (box[row][col+1] == '.') )
{
box[row][col+1]=++letter;
box[row][col++];
}else{
move=rand() % 4;
}
}
}else{
printf("\n\nBloccato a %c\n\n", letter);
break;
}
}
/* FINE */
for(i=0;i<10;i++)/* righe */
{
for(j=0;j<10;j++) /* colonne */
{
if(j == 9)
printf("%c%c\n", box[i][j]); /* giustifico ogni 10 elementi dell array j(0-9) */
else
printf("%c%c", box[i][j]);
}
}
return 0;
}
- Hausaufgaben-tag? 🙂
- Wo es stecken bleibt? Welche Arten der Ausgabe sind Sie zu sehen?
- wusste es gab einen 🙂 tut mir Leid, und für diejenigen, die interessiert, ist nicht eine Aufgabe nur, meine Prüfung sehr geringe Problemlösungsfähigkeit 🙂
- wo sind Sie stecken?
- bekomme ich so etwas wie diese imgur.com/39TP5 mein walker nicht gehen :/
- Ihre tests (im ifs) mit
=
falsch sind. Der Vergleich geschieht mit==
.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Müssen Sie update
row
undcol
innerhalb der Schleife.Ansonsten wirst du immer versuchen, zu Fuß aus der position "A".
... und wenn alle 4 Richtungen gefüllt sind, Sie stecken in einer unendlichen Schleife
Sogar, wenn Sie ein update
row
undcol
innerhalb der Schleife (und korrigieren Sie die==
Fehler), die Sie haben zu handhaben, ein problem: angenommen, der erste Punkt ('A') ist die linke Obere Ecke und die nächste zufällige Richtungen Ost, Süd, Süden, Westen und Norden. ... was nun? 🙂if (box[row][col] == '.') ...
Hinweis==
, nicht=
box[row][++col]=letter;
?for(letter = 'B'; letter <= 'Z'; letter++) { if(box[row+1][col] == '.' || box[row-1][col] == '.' || box[row][col+1] == '.' || box[row][col-1] == '.' )
zu lösen, gesperrt, Richtung Probleme @steabert ich verstehe nicht, wie soll ich diese Zeile BTW danke an alle für die Hilfe, ich wusste nicht, stackoverflow war so genial++row
oder++col
, die erste erhöht dierow
odercol
variable und dann nutzt es.0
erste und dann eine Bewegung1
. Was passiert? Sie gehen in die Falle und sehen, dassrow != 9
so legen Sie diebox[row+1][col]
zu'C'
... ok ... aber was wurde an der Stelle jetzt besetzt mit demC
vor?bow[row][col]
und wie ändere ich die Richtung in diesem Fall? ich denke, ich habe das schreiben dieses Algorithmus wieder 😀Wenn Sie in der for-Schleife.
... Und... das ist alles, denke ich. Dies ist greedy-Algorithmus, so brauchen Sie nicht alle Optimierungen (zumindest sehe ich keine in der übung Anforderungen.
Sieht es aus wie Sie brechen aus Ihrem switch-Anweisung, wenn Sie versuchen, gehen in eine Richtung, die nicht gültig ist, aber Sie erhöhen den counter sowieso. Versuchen Sie zu überprüfen eine zufällige Richtung, wenn das passiert.
move=rand() % 4;
im inneren der Andere aber noch auf der Suche nach einer Bedingung, die prüft, ob die Umgebung Elemente übernommen werden oder nichtelse{ move=rand() % 4; }
Blöcke undbreak;
jedem Fall. Check diesen link zum Beispiel auf "fallen-durch Fällen"wo genau ist er kaputt?
von dem, was ich auf einen Blick sehen kann ist, dass Sie eine chance, dass It_that_walks wird in position von Hexe kann es nicht überall:
wo nach J?
Gibt es keine Notwendigkeit für die
&& (box[row][col-1]= '.')
Allso, es ist falsch (Zuweisung statt Vergleich), es sollte sein:
&& (box[row][col-1]== '.')
(aber Sie brauchen es insgesamt)&& (box[row][col-1]== '.')
da war es nicht notwendig, aber ich kann nicht herausfinden, wie um zu überprüfen, ob die Umgebung Elemente genommen werdenEs ist nicht eine gute Idee, "reroll" die random-Nummer, wenn Sie entdecken, dass Sie nicht gehen können, in irgendeine Richtung, denn wenn Sie Pech haben, bekommen Sie die gleiche Nummer zweimal (oder sogar 3 oder 4 mal oder öfter) - also auch, wenn du generiert 4 zufällige zahlen und Sie nicht alle, das bedeutet nicht, dass Sie fest sind.
Lösen können Sie dieses problem durch die Erzeugung einer Reihe, und zu versuchen, alle 4 möglichen Richtungen ab es:
Umgesetzt, indem Sie den folgenden code:
Beachten Sie, dass dieser Algorithmus ist nicht sehr zufällig: wenn Sie nicht gehen, es gibt eine größere chance, dass Sie nach unten gehen als nach rechts oder Links. Wenn Sie möchten, um es zu beheben, Sie können wählen Sie eine zufällige permutation der 4 Richtungen statt Kontrolle der Richtungen der Reihe nach: