Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

błądzenie losowe

Ostatnio zmodyfikowano 2016-05-18 02:16
Autor Wiadomość
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.

C/C++
#include <iostream>
#include <iostream>
#include <ctime>
#include <cstdlib>

using namespace std;

const int N = 15; // rozmiar tablicy
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++ ) { //inicjalizacja tablicy
        tab1[ i ] = 0;
    }
   
    for( int i = 0; i < N; i++ ) { //warunki na brzegach
        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++ ) { //pętla do przeprowadzenia kolejnego kroku
       
        for( int k = 0; k < 500; k++ ) { // ten fragment kodu chcaiłbym policzyć wielokrotenie, z nowym losowaniem za każdym razem
            int liczba =( rand() % 4 ) + 1;
           
            if( liczba == 1 ) { //warunki zakończenia pętli
                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; // kierunek poruszania się
                licznik++; //-licznik - zlicza ilość ruchów
               
            }
            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; // kierunek poruszania się
                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; // kierunek poruszania się
                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; // kierunek poruszania się
                licznik++;
               
            }
        }
        for( int i = 0; i < N; i++ ) {
            for( int j = 0; j < N; j++ ) {
                cout << tab[ i ][ j ] << " ";
            }
            cout << endl;
        }
    }
   
   
   
    /*
    for(int i=0;i<N;i++){
    for(int j=0;j<N;j++){
    cout << tab[i][j]<<" ";
    }
    cout <<endl;
    }
    */
   
   
   
   
    //cout<<endl<<licznik<<endl; // zlicza ilość kroków
   
   
   
   
   
    return 0;
}[ / i ][ / i ][ / i ][ / i ][ / i ][ / i ][ / b ]
P-148349
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ń
P-148350
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
P-148351
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.
P-148352
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.
P-148353
mateczek
» 2016-05-18 00:01:48
Właściwie żeby losować drogi wcale nie potrzeba tablicy
C/C++
#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-- ) { //twoja pętla do kilkukrotnego losowania drogi. tutaj 10 razy
        punkt2D punkt( 5, 8 ); // punkt startowy
        //pętla losująca drogę
        while(( punkt.x > 0 ) &&( punkt.x < 9 ) &&( punkt.y > 0 ) &&( punkt.y < 9 ) ) { //dopuki nie na krawędzi
            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; //wpisuje jedynkę w punkt, który odwiedzam
        }
       
        cout << "wyladowalem na punkcie x: " << punkt.x << " y: " << punkt.y << endl; //współżędne krawędzi na której wylądował
        cout << droga << '\n' << endl; //błądziłem tak
       
        //drogi.push_back(droga); // zapisujesz drogi
        droga.clear(); //czyszczę drogę by była budowana na nowo
        //cele.push_back(punkt);  //zapisujesz punkty docelowe
       
    }
}
P-148357
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ć
C/C++
for( int i = 0; i < N; i++ ) { // zmienna "i" ustawiasz na stałe
    for( int j = 0; j < N; j++ ) {
        tab[ 0 ][ j ] = 100;
    }
}
// mógłyś tak. Jedna pętla wystarczy
for( int j = 0; j < N; j++ ) {
    tab[ 0 ][ j ] = 100;
}
P-148358
« 1 »
  Strona 1 z 1