losowanie tablicy z warunkami

0

c++/dev

witam
napisalem taka funkcje do losowania dynamicznej tablicy[i][j], gdzie:

1.) dla elementow o indeksach i<j ma losowac wartosci {-1,1,2,3,4,5..n}, n-podawane podczas dzialania programu,
2.) maksymalna losowana wartosc-"czas" podaje sie podczas dzialania programu
2) w kazdym wierszu oprócz ostatniego ma wystapic przynajmniej raz liczba różna od -1,w ostatnim wierszu same -1
3.) w kazdej kolumnie oprócz pierwszej ma wystapic przynajmniej raz liczba różna od -1, w pierwszej kolumnie same -1

Mój kod wygląda nastepująco: //wycinek programu

for(int i=0; i<w; i++)
                    { 
                    int flaga_w=0;                                       
                      do
                      {
                                      for(int j=0;j<w;j++)
                                       {                           
                                        if (i<j){                                    
                                                 int los=(rand()%(czas+2)); 
                                                 tablica[i][j]=los;
                                                 if(tablica[i][j]==0 || tablica[i][j]==czas+1 )
                                                              {  
                                                                     tablica[i][j]=-1;
                                                              }
                                                                                                                            
                                                 if (tablica[i][j]!=-1)   flaga_w=1;                                               
                                                                                                  
                                                }                   
                                       } 
                      }
                      while(flaga_w==0 && i<w-1);                      
                    }

zrealizowalem warunek: ze w wierszu ma byc przynajmniej jedna rózna od -1.
Nie wiem jak zrobic ten warunek dla kolumny :/

prosze o pomoc

1

komplikujesz sobie życie nie rozbijając tego na części

  1. zapełnij tablicę elementami losowymi ale zaczynając od drugiej kolumny i kończąc na przedostatnim wierszu
  2. przemiataj wiersze ( poza ostatnim ) sprawdzając czy wszystkie są -1 ( jeśli tak to losujesz nową wartość zaczynając od zera i numer elementu )
  3. to samo dla kolumn
  4. zapełnij pozostały wiersz i kolumnę wartościami -1
0

@fake_nick, doprawdy?
for(int y=0,L=w-1;y<=L;++y) for(int x=y+1;x<=L;++x) tablica[y][x]=(x==L||y=L)*(rand()%(czas+2))-1;

0

i co to ma wspólnego z czytelnym i łatwym do zrozumienia kodem ?
może czujesz się jak pro, ale w rzeczywistości jest to bełkot przez który trzeba się przebić aby zrozumieć co ma robić ten kawałek kodu

0

elementy tablicy[i][j] , gdzie i<j mają miec wartosc -1. reszta ma byc losowana z zbioru {-1,1,2,3,4,5,6...n }, wsrod wylosowanych liczb dla kazdego wiersza ma wystąpić przynajmniej raz liczba !=-1, i tak samo dla kolumy
np.:
-1 4 -1 3 3
-1 -1 2 -1 2
-1 -1 -1 -1 4
-1 -1 -1 -1 5
-1 -1 -1 -1 -1

chodzi o to żeby wśród tych wylosowanych liczb, w każdym wierszu i kolumnie wystąpiła przynajmniej raz liczba !=-1

4 -1 3 3
2 -1 2
-1 4
5

Tak byloby źle, bo w jednej z kolumn wylosowane zostaly same -1

7  -1    4   3
    -1  -1   2
         -1   4
               5

Tak byloby źle, bo w jednym z wierszy wylosowane zostaly same -1

2  -1    6    2
    -1  -1   -1
         -1    8
                4
1
  1. dla i<j już wstawiliśmy -1:
 ?  ?  ?  ?  ?
-1  ?  ?  ?  ?
-1 -1  ?  ?  ?
-1 -1 -1  ?  ?
-1 -1 -1 -1  ?
  1. teraz zajmijmy się ostatnim wierszem, tam trzeba tylko jedną wyłosować z których jedna ma być -1, czyli nie mamy wyboru trzeba tam wstawić -1. Przy okazji całą ostatnią kołumne zaznaczmy że ma nie zawierać -1, bo jedną -1 już w tej kołumnie mamy:
 ?  ?  ?  ?  #
-1  ?  ?  ?  #
-1 -1  ?  ?  #
-1 -1 -1  ?  #
-1 -1 -1 -1 -1
  1. teraz zajmijmy się przedostatnim wierszem, zostało tylko jedno miejscę na -1, więc:
 ?  ?  ?  #  #
-1  ?  ?  #  #
-1 -1  ?  #  #
-1 -1 -1 -1  #
-1 -1 -1 -1 -1
  1. analogicznie dla kolejnego wiersza:
 ?  ?  #  #  #
-1  ?  #  #  #
-1 -1 -1  #  #
-1 -1 -1 -1  #
-1 -1 -1 -1 -1
  1. i jeszcze raz:
 ?  #  #  #  #
-1 -1  #  #  #
-1 -1 -1  #  #
-1 -1 -1 -1  #
-1 -1 -1 -1 -1
  1. no i ostatni:
-1  #  #  #  #
-1 -1  #  #  #
-1 -1 -1  #  #
-1 -1 -1 -1  #
-1 -1 -1 -1 -1
  1. teraz wystarczy zamiast # powstawiać wylosowane liczby z zakresu 1..n
    pasuje do tego kod:
for(int y=0,L=w-1;y<=L;++y) for(int x=0;x<=L;++x) tablica[y][x]=x>y?(rand()%(czas+1)+1):-1;

Z tym że jak podejrzewam, znowu coś pokręciłeś.

1 użytkowników online, w tym zalogowanych: 0, gości: 1