Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Zyklisches Array, synchronisiertes Update

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
08.12.2004, 22:30 Uhr
~Asterix4
Gast


Hi,

ich habe ein Array int a[M], dass die Werte -1 bis N annehmen kann. Ich durchlaufe das Array per Schleife und ich würde gern in jedem Arraydurchlauf jedes a[i], falls a[i] != -1, um genau a[i] Felder weiterrücken lassen, so dass es zu a[i+a[i]] wird, es sei denn, i+a[i] >= N, dann rutscht der Wert vorne wieder in das Array rein (wird also zu a[i+a[i]-N]). Die Randbedingungen bei dem Problem sind folgende. Ein Feld mit a[i] > 0 darf zwar a[i] Felder vorrücken, aber nur dann, wenn es dabei kein anderes a[j] >= 0 überspringt; wenn es sagen wir 3 Felder zum nächsten a[j] != -1 ist, und a[i] = 27, dann verschiebt man a[i] trotzdem um drei Felder, und weist ihm den wert 3 zu ... verständlich, bisher?

ich weiss nicht, wie man so etwas schön implementieren kann. Die realität, die dieses Programm simulieren soll (es geht da um ein biologisches problem), funktioniert synchron, aber ich weiß nicht, wie ich das schlau synchron implementieren kann. bisher suche ich mir ein Feld, dass ziehen kann, und gehe dann gegen den Uhrzeigersinn vor, und verschiebe weiter. Geht das auch irgendwie schlauer (mit hilfe von speziellen superinformatikalgos, zum Beispiel?).

Jemand ne idee?

Grüsse (nehmt euch davon, so viel ihr wollt :-))
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
08.12.2004, 23:05 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


poste mal bitte ein aussagekräfitiges beispiel also einmal array vor und nach dem durchlauf... bin mir nicht sicher ob ich das verstanden habe
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
08.12.2004, 23:11 Uhr
~Asterix4
Gast



C++:
/* Werte von -1 bis 3 */
int a[10] = { -1, 2, -1, -1, -1, 3, -1, 1, -1, 1 };
shift(a);
/*Jetzt a = { 1, -1, -1, 2, -1, -1, 1, -1, 1, -1 } */
sift(a);
/*Jetzt a = { -1, 1, -1, -1, -1, 2, -1, 1, -1, 1 } */

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
08.12.2004, 23:23 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


also zum ersten... wenn du ne zahl verschiebst kommt an die alte stelle ne -1 oder?

äh wenn ich das richtig verstehe stellst du beim ersten durchlauf bei der drei fest das du die nur um eine stelle verschieben darfst und schreibst dann entsprechend ne 1 hin und verschiebst die auch nur um eine stelle... was passiert wenn die sich nicht verschieben lässt weil hinter der drei gleich wieder eine zahl ungleich -1 steht... dann kannst du ja nicht verschieben und müsstest nach deiner beschreibung ne Null dahinpacken die dann bei jedem durchlauf an ihrem platz verharrt... ist das so gedacht?


wenn ja würd ichs auf die schnelle so coden

C++:
void ausgeben(int *a,int m){while(--m)printf("%d\t",*a++);printf("%d\n",*a);}

void shift(int *a, int m){
int j,i,x;
for(i=0;i<m;++i)
        if(a[i]!=-1){
            for(j=0,x=a[i];j<x && a[(i+j+1)%m]==-1;++j);
            a[i]=-1;
            a[(i+j)%m]=j;
            i+=j;
        }

}

int main(){

int a[10] = { -1, 2, -1, -1, -1, 3, -1, 1, -1, 1 };
ausgeben(a,10);
shift(a,10);
ausgeben(a,10);
shift(a,10);
ausgeben(a,10);

}
--
...fleißig wie zwei Weißbrote

Dieser Post wurde am 09.12.2004 um 00:18 Uhr von Windalf editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: