•hory0603
Strain
Karma: 0
Deconectat
Mesaje: 4
|
 |
« : Noiembrie 09, 2007, 17:59:32 » |
|
pornind de la acest "joc" http://en.wikipedia.org/wiki/Conway's_Game_of_Life , am intalnit o problema care suna cam asa : avand data o matrice (m*n) de cel mult 1000/1000 si o configuratie initiala a acesteia (vezi regulile jocului) cu celule vii, respectiv moarte, sa se afiseze matricea dupa generatia cu nr T (nu si generatiile intermediare). problema de care m-am lovit este faptul ca acest T este putin cam mare (1.000.000) iar un algoritm de complexitate T*m*n ruleaza cam....mult  . pe google am dat doar de simulatoare,nu si de o sursa care sa-mi afiseze doar ultima configuratie. daca s-a mai lovit cineva de pb asta si are o solutie,o sursa sau macar o idee, va rog sa-mi spuneti si mie. multumesc.
|
|
|
Memorat
|
|
|
|
|
•hory0603
Strain
Karma: 0
Deconectat
Mesaje: 4
|
 |
« Răspunde #2 : Noiembrie 10, 2007, 11:38:37 » |
|
Uite enuntul original al problemei. (La asta te-ai referit cand ai cerut sursa problemei nu?)
|
|
|
Memorat
|
|
|
|
•Cosmin
|
 |
« Răspunde #3 : Noiembrie 10, 2007, 11:43:22 » |
|
Nu, intrebam de la ce concurs e. Sper ca nu e unul in desfasurare ...
|
|
|
Memorat
|
|
|
|
•hory0603
Strain
Karma: 0
Deconectat
Mesaje: 4
|
 |
« Răspunde #4 : Noiembrie 10, 2007, 12:51:35 » |
|
aa  ...nu e vorba despre niciun concurs . e una dintre aplicatiile primite la facultate (sunt student in anul 1 la automatica)
|
|
|
Memorat
|
|
|
|
•Cosmin
|
 |
« Răspunde #5 : Noiembrie 10, 2007, 13:14:12 » |
|
Misto, deci nu e un concurs e tema  si eu care credeam ca vrei sa te ajut la ceva pt care trebuie sa te descurci singur  Oricum cerinta cu afisat pe ecran si citit de la tastatura pare sa faca limitele impuse putin dubioase  .
|
|
|
Memorat
|
|
|
|
•hory0603
Strain
Karma: 0
Deconectat
Mesaje: 4
|
 |
« Răspunde #6 : Noiembrie 10, 2007, 16:55:50 » |
|
chestia cu cititu de la tastatura e practic de forma (pentru ca inca nu s-a predat lucrul cu fisiere)..insa datele vor fi citite fortat dintr-un fisier (din command prompt : sursa.exe <fisier.txt ). so, exista vreo idee de la care sa plec pentru o rezolvare eficienta (=cu complexitate mai mica decat t*m*n) ?
|
|
|
Memorat
|
|
|
|
•svalentin
|
 |
« Răspunde #7 : Noiembrie 30, 2007, 22:23:45 » |
|
Pana la urma ce algoritm ai implementat? Dupa ce se corecteaza, sa ne spui si noua, poate ii ajuta si pe altii 
|
|
|
Memorat
|
|
|
|
•lache92
Strain
Karma: -10
Deconectat
Mesaje: 18
|
 |
« Răspunde #8 : Ianuarie 21, 2008, 19:52:05 » |
|
asa ceva se face la facultate... eu am facut-o in clasa a 9-a fara vreo problema majora..... #include <fstream.h> #include <stdlib.h> #include <conio.h>
void citeste_fisier(int &, int &, int[20][20], int[20][20]); void arata(int [20][20], int ,int); void schimbare(int[20][20], int[20][20], int, int);
int main() { int M[20][20], MOD[20][20];char x='n'; register int c = 0; int i, y, n, m; citeste_fisier(n, m, M, MOD); arata(M, n, m); cout<<"Iesiti? (d/n) "; x = getche(); cout<<'\n'<<'\n'<<'\n'<<'\n'; if(x == 'd') return 0; while(x != 'd') { schimbare(M, MOD, n, m); arata(M, n, m); cout<<"Iesiti? (d/n) "; x = getche(); cout<<'\n'; for(int lol = 0; lol < 3; lol++) cout<<'\n'; }
return 0; } void citeste_fisier(int & a, int & b, int M[20][20], int MOD[20][20]) { fstream f("start.in", ios::in); f>>a>>b; for (int i = 0; i < a; i++) for(int y = 0; y < b; y++) { f>>M[i][y]; MOD[i][y] = M[i][y]; } }
void arata(int M[20][20], int n, int m) { char x; static int contor = 0;
cout<<"Pasul t + "<<contor<<"."<<'\n'; for(int i = 0; i < n; i++) { for(int y = 0; y < m; y++) cout<<M[i][y]; cout<<'\n'; } contor++; }
void schimbare(int M[20][20], int MOD[20][20], int n, int m) { int nr = 0; for(int i = 0; i < n; i++) for( int y = 0; y < m; y++) { if(M[i-1][y-1] == 1) nr++; if(M[i-1][y] == 1) nr++; if(M[i-1][y+1] == 1) nr++; if(M[i][y-1] == 1) nr++; if(M[i][y+1] == 1) nr++; if(M[i+1][y-1] == 1) nr++; if(M[i+1][y] == 1) nr++; if(M[i+1][y+1] == 1) nr++; if(M[i][y] == 1) { if (nr<2 || nr >3) MOD[i][y] = 0; } if (M[i][y] == 0) if (nr==3) MOD[i][y] = 1; nr = 0; }
for(int i = 0; i < n; i++) for(int y = 0; y < m; y++) M[i][y] = MOD[i][y]; }
afiseaza ceva de genul: pasul t + x; aici este matricea. Doriti sa continuati? (d/n) samd.
|
|
« Ultima modificare: Ianuarie 21, 2008, 19:56:08 de către Hulub Ionut-Adrian »
|
Memorat
|
|
|
|
•devilkind
|
 |
« Răspunde #9 : Ianuarie 21, 2008, 22:46:17 » |
|
da pai algoritmul tau are complexitate o(N*M*T) ceea ce e prea mare ptr restrictiile problemei.
|
|
|
Memorat
|
|
|
|
•lache92
Strain
Karma: -10
Deconectat
Mesaje: 18
|
 |
« Răspunde #10 : Ianuarie 21, 2008, 23:22:12 » |
|
dar avand in vedere ca e spre a fi citit in consola la fiecare pas nu e nici o problema 
|
|
« Ultima modificare: Ianuarie 21, 2008, 23:23:52 de către Hulub Ionut-Adrian »
|
Memorat
|
|
|
|
•skyel
|
 |
« Răspunde #11 : Ianuarie 22, 2008, 14:04:07 » |
|
nu chiar ca si la acm citesti date din consola si asta nu afecteaza timpul de rulare...
|
|
|
Memorat
|
|
|
|
•bogdan2412
|
 |
« Răspunde #12 : Ianuarie 22, 2008, 17:27:18 » |
|
chiar daca citesti de la consola se pot redirectiona fisiere in stdin ./program < fisier.in > fisier.out sau se pot folosi pipe-uri cat fisier.in | ./program
|
|
« Ultima modificare: Ianuarie 22, 2008, 17:29:46 de către Bogdan Tataroiu »
|
Memorat
|
|
|
|
•lache92
Strain
Karma: -10
Deconectat
Mesaje: 18
|
 |
« Răspunde #13 : Ianuarie 22, 2008, 19:54:17 » |
|
ceea ce vreoiam sa zic este ca oamenii nu percep diferente in timpul re rulare de ordinul milisecundelor asa ca nu conteaza care este complexitatea.
|
|
|
Memorat
|
|
|
|
•DITzoneC
|
 |
« Răspunde #14 : Ianuarie 22, 2008, 20:11:05 » |
|
Iar ce incercau Bogdan si Razvan sa zica era ca se pot sesiza aceste diferente cu ajutorul calculatorului. time ./program < fisier.in > fisier.out
|
|
|
Memorat
|
|
|
|
•devilkind
|
 |
« Răspunde #15 : Ianuarie 22, 2008, 21:25:47 » |
|
si un program cu o complexitate aprox de 1000*1000*1000000 poate dura destul de mult, ore intregi (daca nu si mai mult).
|
|
|
Memorat
|
|
|
|
|