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

Sudoku, problem z warunkiem.

Ostatnio zmodyfikowano 2017-06-10 16:57
Autor Wiadomość
wld1337
Temat założony przez niniejszego użytkownika
Sudoku, problem z warunkiem.
» 2017-06-10 16:57:34
Na wstępie zaznaczę, że szukałem odpowiedzi na pytania w innych tematach związanych z sudoku, niestety opisane niżej polecenie działa nieco inaczej niż te proponowane przy typowym sudoku. Kod może wydać się nieczytelny, ze względu na obszerne komentarze - chciałem jak najlepiej przedstawić problem.
C/C++
bool koniec = false;
do {
   
    printf( "Polecenie: " );
    char polecenie[ 100 ];
    fflush( stdout );
    fgets( polecenie, 100, stdin );
   
    if( strstr( polecenie, "ustaw" ) == polecenie ) {
       
        int y = polecenie[ 6 ] - 65; //zapisuje w zmiennej y znak kolumny (np A) następnie odejmuje 65 w celu zamiany na liczbę.
        int x = polecenie[ 7 ] - 49; //zapisuje w zmiennej x znak numeru wiersza (np 1) następnie odejmuje 49 w celu zamiany na liczbę, uwzględniając 0.
        int nowa_wartosc = polecenie[ 9 ] - 48; // zapisuje w zmiennennej znak nowej wartości zmiennej (np 5) odejmuje 48 w celu zamiany na liczbę
       
        for( int k = 0; k < 9; ++k ) { // pętla umożliwiająca sprawdzenie warunku po wszystkich kolumnach i wierszach
           
            if( sudoku[ y ][ k ] == nowa_wartosc || sudoku[ k ][ x ] == nowa_wartosc || sudoku[ y ][ x ] != 0 ) { // warunek sprawdzający czy wartość wystepuje w kolumnie/wierszu bądź czy dane pole jest 'puste' tzn czy jest zerem. Jeśli którykolwiek warunek zostanie spełniony wypluje komunikat o tym że nie może ustawić danej wartosci w tym miejscu.
               
                cout << "Nie mozna ustawic takiej wartosci<<endl;
                for( int y = 0; y < 9; y++ ) for( int x = 0; x < 9; x++ ) printf( "%s%d%s",(( x > 0 ) ? " "
                    : "" ), sudoku[ y ][ x ],(( x == 8 ) ? "\n"
                    : "" ) ); // przepisuje tablice sudoku bez zmian
               
                break; //(?) kończy pętle w momencie spełnienia warunku jednokrotnie (?)
            }
        }
       
        for( int p = 0; p < 9; ++p ) { //druga pętla lecąca po wszystkich kolumnach i wierszach - gdy umieszczałem w jednej - pomija pierwszy warunek (?)
           
            if( sudoku[ y ][ p ] != nowa_wartosc && sudoku[ p ][ x ] != nowa_wartosc && sudoku[ y ][ x ] == 0 ) { // jeśli wartość nie występuje w kolumnie ani w wierszu i do tego pole jest zerem wykona instrukcje
               
                sudoku[ y ][ x ] = nowa_wartosc; // nadpisuje we wskazanym miejscu daną wartość, jeśli warunek został spełniony
                for( int y = 0; y < 9; y++ ) for( int x = 0; x < 9; x++ ) printf( "%s%d%s",(( x > 0 ) ? " "
                    : "" ), sudoku[ y ][ x ],(( x == 8 ) ? "\n"
                    : "" ) ); //wyrzuca tablice ze zmienioną wartością
               
            }
        }
       
    }
   
} while( !koniec );

return EXIT_SUCCESS;
}

Moje pytanie brzmi - co z drugim warunkiem jest nie tak, ze dla przypadku kiedy pole jest równe 0 ale wartość występuje w danym wierszu bądź kolumnie, i tak zostanie on uruchomiony? W efekcie najpierw spełniany jest warunek pierwszy - czyli tablica przepisywana bez zmian, a zaraz potem uruchamia się drug if i wypluwa tablicę sudoku ze zmienioną wartością w tym miejscu. Spędziłem nad tym trochę czasu i niestety nie jestem w stanie sam dostrzec i wyeliminować błędu.
P-162331
« 1 »
  Strona 1 z 1