błądzenie losowe
Ostatnio zmodyfikowano 2016-05-18 02:16
pawellgawell Temat założony przez niniejszego użytkownika |
błądzenie losowe » 2016-05-17 21:00:01 witam, napisałem program, w którym z danego punktu tablicy 2D wyznaczana jest losowa ścieżka(przebyta droga w programie oznaczona jest jedynkami w tablicy). program przerywa prace gdy "dotknie" któregoś brzegu tablicy i wyświetla wartość, która jest na jej brzegu. chciałbym dodać do programu taką rzecz, która np w 10 uruchomieniach wyznacza za każdym razem inną ścieżke. niestety nie mogę tego rozgryźć. z góry dziękuję za podpowiedzi. #include <iostream> #include <iostream> #include <ctime> #include <cstdlib>
using namespace std;
const int N = 15; const int a = 1; const int b = 10;
int main() { int tab[ N ][ N ]; int tab1[ b ]; int x = 7; int y = 7; int licznik = 0; for( int i = 0; i < b; i++ ) { tab1[ i ] = 0; } for( int i = 0; i < N; i++ ) { for( int j = 0; j < N; j++ ) { tab[ i ][ j ] = 0; } } for( int i = 0; i < N; i++ ) { for( int j = 0; j < N; j++ ) { tab[ 0 ][ j ] = 100; } } for( int i = 0; i < N; i++ ) { for( int j = 0; j < N; j++ ) { tab[ N - 1 ][ j ] = 50; } } for( int i = 0; i < N; i++ ) { for( int j = 0; j < N; j++ ) { tab[ i ][ 0 ] = 20; } } for( int i = 0; i < N; i++ ) { for( int j = 0; j < N; j++ ) { tab[ i ][ N - 1 ] = 40; } } int suma = 0; srand( time( NULL ) ); for( int i = 0; i < 2; i++ ) { for( int k = 0; k < 500; k++ ) { int liczba =( rand() % 4 ) + 1; if( liczba == 1 ) { if( x == N - a || y == N - a || x == 0 || y == 0 ) { cout << "wartosc nabrzegu: " << endl; cout << tab[ x ][ y ] << endl; cout << endl; break; } tab[ x++ ][ y ] = 1; licznik++; } else if( liczba == 2 ) { if( x == N - a || y == N - a || x == 0 || y == 0 ) { cout << "wartosc nabrzegu: " << endl; cout << tab[ x ][ y ] << endl; cout << endl; break; } tab[ x-- ][ y ] = 1; licznik++; } else if( liczba == 3 ) { if( x == N - a || y == N - a || x == 0 || y == 0 ) { cout << "wartosc nabrzegu: " << endl; cout << tab[ x ][ y ] << endl; cout << endl; break; } tab[ x ][ y++ ] = 1; licznik++; } else if( liczba == 4 ) { if( x == N - a || y == N - a || x == 0 || y == 0 ) { cout << "wartosc nabrzegu: " << endl; cout << tab[ x ][ y ] << endl; cout << endl; break; } tab[ x ][ y-- ] = 1; licznik++; } } for( int i = 0; i < N; i++ ) { for( int j = 0; j < N; j++ ) { cout << tab[ i ][ j ] << " "; } cout << endl; } } return 0; }[ / i ][ / i ][ / i ][ / i ][ / i ][ / i ][ / b ]
|
|
michal11 |
» 2016-05-17 21:13:13 W takim razie musisz gdzieś zapisywać te przebyte ścieżki i sprawdzać czy już wcześniej po takiej nie szedłeś. Pro tip: losowanie bez powtórzeń |
|
pawellgawell Temat założony przez niniejszego użytkownika |
» 2016-05-17 21:23:13 tzn, chcę tylko zapisywać wartość na brzegu na którą natrafił ten poruszający się "punkt". i z tym mam problem |
|
michal11 |
» 2016-05-17 21:29:04 wyznacza za każdym razem inną ścieżke |
No to chcesz mieć inne całe ścieżki czy tylko końcową wartość ? W sumie to i tak zasada jest taka sama. Zapisuj wcześniej wylosowane gdzieś i losuj nowe dopóki są różne od wcześniejszych. |
|
pawellgawell Temat założony przez niniejszego użytkownika |
» 2016-05-17 21:35:52 przepraszam za nieściłość wypowiedzi. chcę przeprowadzić np 100 prób i zapisać wartość ścianki w którą trafił "punkt". tylko,że jak to wrzucam do pętli for to nie działa. |
|
mateczek |
» 2016-05-18 00:01:48 Właściwie żeby losować drogi wcale nie potrzeba tablicy #include <iostream> #include<string> #include<vector> #include<ctime> struct punkt2D { int x; int y; punkt2D( int _x, int _y ) : x( _x ) , y( _y ) { } }; enum _kierunek { gora = 0, dol = 1, prawo = 2, lewo = 3 };
using namespace std; int main() { srand( time( NULL ) ); int tablica[ 10 ][ 10 ] = { 0 }; _kierunek kier; string droga; vector < punkt2D > cele; vector < string > drogi; int ileRazy = 10; while( ileRazy-- ) { punkt2D punkt( 5, 8 ); while(( punkt.x > 0 ) &&( punkt.x < 9 ) &&( punkt.y > 0 ) &&( punkt.y < 9 ) ) { kier = static_cast < _kierunek >( rand() % 4 ); if( kier == gora ) { punkt.y++; droga += 'G'; } else if( kier == dol ) { punkt.y--; droga += 'D'; } else if( kier == prawo ) { punkt.x++; droga += 'P'; } else if( kier == lewo ) { punkt.x--; droga += 'L'; } tablica[ punkt.y ][ punkt.x ] = 1; } cout << "wyladowalem na punkcie x: " << punkt.x << " y: " << punkt.y << endl; cout << droga << '\n' << endl; droga.clear(); } } |
|
mateczek |
» 2016-05-18 02:16:50 rzuciło mi się w oczy to podwójne kręcenie pętlą skoro chcesz tylko jeden rząd ustawić for( int i = 0; i < N; i++ ) { for( int j = 0; j < N; j++ ) { tab[ 0 ][ j ] = 100; } }
for( int j = 0; j < N; j++ ) { tab[ 0 ][ j ] = 100; }
|
|
« 1 » |