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

[C++] Tabela 0\1- jedna wartość w wierszu i kolumnie algorytm

Ostatnio zmodyfikowano 2014-11-08 22:53
Autor Wiadomość
scartout
Temat założony przez niniejszego użytkownika
[C++] Tabela 0\1- jedna wartość w wierszu i kolumnie algorytm
» 2014-11-07 18:39:34
Witam.

Mam taką tablicę:

1 0 0 1
0 1 0 1
0 1 0 1
0 0 1 0

Kombinuję nad algorytmem (bez sukcesów), który zostawi mi tylko jedną 'jedynkę' w każdym wierszu i kolumnie czyli albo

1 0 0 0
0 1 0 0
0 0 0 1
0 0 1 0

albo

1 0 0 0
0 0 0 1
0 1 0 0
0 0 1 0

Jak to napisać? Dotąd napisałem coś takiego, co pomaga pewne 'jedynki' wykreślić ale myślę że nie warto się tym sugerować:

C/C++
for( int j = 0; j < b; j++ ) {
    h = 0;
    for( int i = 0; i < a; i++ ) {
        if( table4[ i ][ j ] == 1 ) {
            h++;
            if( h > 1 ) {
                for( int j = 0; j < b; j++ ) table4[ i ][ j ] = 0;
               
            } } } }

Najważniejsze: algorytm ma być uniwersalny czyli nie tylko dla tego przykładu.
P-120137
scartout
Temat założony przez niniejszego użytkownika
» 2014-11-08 18:50:53
Nikt nie ma żadnego pomysłu? :)
P-120186
1aam2am1
» 2014-11-08 19:04:46
C/C++
bool linia = 0;
for( int i = 0; i < a; i++ )
{
    linia = 0;
    for( int j = 0; j < b; j++ ) {
        if( tab[ i ][ j ] == 1 )
        {
            if( linia )
            {
                tab[ i ][ j ] = 0;
            }
            else
            {
                linia = 1;
            }
        }
    }
}
Nie sprawdzałem czy działa.
P-120189
scartout
Temat założony przez niniejszego użytkownika
» 2014-11-08 20:15:25
Dzięki za odpowiedź! Niestety funkcja nie realizuje planu do końca - zdarza się zwracać dwie ''jedynki'' w tej samej kolumnie za to jedną kolumnę zostawić z ''zerami''. Doprecyzuję, że chodzi konkretnie o takie dopasowanie w pozostawieniu ,,jedynek'' by każda zostawała tylko jedna ,,jedynka'' w danej kolumnie i w danym wierszu, najlepiej sprawdzając czy najpierw te pojedyncze ,,jedynki'' i ewentualnie wracając do tych podwójnych. Ale jak to zapętlić to dla mnie magia :D
P-120193
1aam2am1
» 2014-11-08 20:58:38
Powiem tak jeżeli ta moja funkcja nie działa dla wierszy oznacza to że może działać dla kolumn.
Sprawdź. Jeżeli działa spróbuj ją przerobić, bo forum jest od dawania rad a nie kodu. Trzeba nauczyć się myśleć kreatywnie.
P-120195
scartout
Temat założony przez niniejszego użytkownika
» 2014-11-08 22:53:27
Prawdę mówiąc ciągle walczę, ale już pomysłów brakuje. Nowy kod działa ale nie do końca :

C/C++
//Krok 1 Nadmiarowe ''jedynki'' w wierszu zamieniam na ''dwójki''

for( int i = 0; i < a; i++ ) {
    u = 0;
    v = 0;
    h = 0;
    for( int j = 0; j < b; j++ ) {
        if( table4[ i ][ j ] == 1 ) {
            h++;
            if( h > 1 ) table4[ i ][ j ] = 2;
           
        } } }

//Krok 2 Usunięcie powtórzeń ''jedynek'' w kolumnach

do {
    for( int j = 0; j < b; j++ ) {
        h = 0;
        for( int i = 0; i < a; i++ ) {
            if( table4[ i ][ j ] == 1 ) h++;
           
            if( h > 1 && table4[ i ][ j ] == 1 ) {
                table4[ i ][ j ] = 0; }
        } }
   
   
    //Krok 3 Znalezienie innej jedynki spośród ''dwójek'' w zamian za usuniętą
   
    for( int i = 0; i < a; i++ ) {
        u = 0;
        v = 0;
        for( int j = 0; j < b; j++ ) {
            if( table4[ i ][ j ] == 1 ) u++;
           
            if( table4[ i ][ j ] == 2 ) v++;
           
            if( u == 0 && v == 1 && table4[ i ][ j ] == 2 ) table4[ i ][ j ] = 1;
           
        } }
   
   
   
    for( int j = 0; j < b; j++ ) {
        h = 0;
        for( int i = 0; i < a; i++ ) {
            if( table4[ i ][ j ] == 1 ) h++;
           
            if( h > 1 ) {
                table4[ i ][ j ] = 2; }
            // if (table4[i][j]==2 && h==3) table4[i][j]=1;
        } }
   
    //Krok 4 Sprawdzenie czy jeszcze wystepuja powtorzenia
   
    f = 0;
    v = 0;
    for( int j = 0; j < b; j++ ) {
        u = 0;
        h = 0;
        for( int i = 0; i < a; i++ ) {
            h++;
            if( table4[ i ][ j ] == 1 ) u++;
           
            if( table4[ i ][ j ] != 1 ) f++;
           
            if( h == a && u > 1 ) v++;
           
            if( h == a && f == a ) v++;
           
        } } } while( v != 0 );

//Krok 5 Pozbycie sie dwójek

for( int i = 0; i < a; i++ ) {
    for( int j = 0; j < b; j++ ) {
        if( table4[ i ][ j ] == 2 ) table4[ i ][ j ] = 0; } }

Działa dla wcześniej podanego przykładu. Ale dla takiego:

0 1 1 0
1 0 0 1
0 0 0 1
1 1 0 1

osiąga wynik:

0 1 0 0
1 0 0 0
0 0 0 1
0 0 0 0

zamiast oczekiwanego:

0 0 1 0
1 0 0 0
0 0 0 1
0 1 0 0
P-120206
« 1 »
  Strona 1 z 1