Carlosss Temat założony przez niniejszego użytkownika |
Sudoku (jak zwykle działa nie tak jak należy) » 2010-12-18 20:38:39 Kod: #include <iostream> #include <conio.h> using namespace std; int wylos_liczba[ 9 ][ 9 ]; bool czy_zajete = false;
void losowanie( int &, int & ); int sprawdzanieA( bool &, int &, int & ), sprawdzenieB( bool &, int &, int & ), sprawdzenie( bool &, int &, int & ); int main() { int a, b; srand( time( 0 ) ); for( a = 0; a < 9; a++ ) { for( b = 0; b < 9; b++ ) { losowanie( a, b ); sprawdzanieA( czy_zajete, a, b ); sprawdzenieB( czy_zajete, a, b ); sprawdzenie( czy_zajete, a, b ); if( czy_zajete == 1 ) { int g = 1; for( g = 1; g < 10; g++ ) { wylos_liczba[ a ][ b ] = g; sprawdzanieA( czy_zajete, a, b ); sprawdzenieB( czy_zajete, a, b ); sprawdzenie( czy_zajete, a, b ); if( czy_zajete == 0 ) g += 10; } } } } cout << "Inicjalizacja liczb zakonczona pomyslnie\n"; for( int i = 0; i < 9; i++ ) { for( int j = 0; j < 9; j++ ) { cout << wylos_liczba[ i ][ j ] << " "; } cout << endl << endl; } getch(); }
void losowanie( int & a, int & b ) { wylos_liczba[ a ][ b ] = 1 + rand() %( 10 - 1 ); }
int sprawdzanieA( bool & czy, int & a, int & b ) { for( int i = 0; i < a; i++ ) { if( wylos_liczba[ a ][ b ] == wylos_liczba[ i ][ b ] ) czy = true; } for( int i = a; i < 9; i++ ) { if( wylos_liczba[ a ][ b ] == wylos_liczba[ i ][ b ] ) czy = true; } } int sprawdzenieB( bool & czy, int & a, int & b ) { for( int i = 0; i < b; i++ ) { if( wylos_liczba[ a ][ b ] == wylos_liczba[ a ][ i ] ) czy = true; } for( int i = b; i < 9; i++ ) { if( wylos_liczba[ a ][ b ] == wylos_liczba[ a ][ i ] ) czy = true; } } int sprawdzenie( bool & czy, int & a, int & b ) { int msc_krata, msc_kratb; int n = a + 1, m = a - 1, p = b + 1, o = b - 1; if( a == 0 || a == 3 || a == 6 ) msc_krata = 1; else if( a == 1 || a == 4 || a == 7 ) msc_krata = 2; else if( a == 2 || a == 5 || a == 8 ) msc_krata = 3; if( b == 0 || b == 3 || b == 6 ) msc_kratb = 1; else if( b == 1 || b == 4 || b == 7 ) msc_kratb = 2; else if( b == 2 || b == 5 || b == 8 ) msc_kratb = 3; if( msc_krata == 1 && msc_kratb == 1 ) { if( wylos_liczba[ a ][ b ] == wylos_liczba[ n ][ p ] || wylos_liczba[ a ][ b ] == wylos_liczba[ n ][ p + 1 ] || wylos_liczba[ a ][ b ] == wylos_liczba[ n + 1 ][ p ] || wylos_liczba[ a ][ b ] == wylos_liczba[ n + 1 ][ p + 1 ] ) czy = true; } else if( msc_krata == 1 && msc_kratb == 2 ) { if( wylos_liczba[ a ][ b ] == wylos_liczba[ n ][ p ] || wylos_liczba[ a ][ b ] == wylos_liczba[ n ][ o ] || wylos_liczba[ a ][ b ] == wylos_liczba[ n + 1 ][ p ] || wylos_liczba[ a ][ b ] == wylos_liczba[ n + 1 ][ 0 ] ) czy = true; } else if( msc_krata == 1 && msc_kratb == 3 ) { if( wylos_liczba[ a ][ b ] == wylos_liczba[ n ][ o ] || wylos_liczba[ a ][ b ] == wylos_liczba[ n ][ o - 1 ] || wylos_liczba[ a ][ b ] == wylos_liczba[ n + 1 ][ o ] || wylos_liczba[ a ][ b ] == wylos_liczba[ n + 1 ][ o - 1 ] ) czy = true; } else if( msc_krata == 2 && msc_kratb == 1 ) { if( wylos_liczba[ a ][ b ] == wylos_liczba[ n ][ p ] || wylos_liczba[ a ][ b ] == wylos_liczba[ m ][ p ] || wylos_liczba[ a ][ b ] == wylos_liczba[ n ][ p + 1 ] || wylos_liczba[ a ][ b ] == wylos_liczba[ m ][ p + 1 ] ) czy = true; } else if( msc_krata == 3 && msc_kratb == 1 ) { if( wylos_liczba[ a ][ b ] == wylos_liczba[ m ][ p ] || wylos_liczba[ a ][ b ] == wylos_liczba[ m - 1 ][ p ] || wylos_liczba[ a ][ b ] == wylos_liczba[ m ][ p + 1 ] || wylos_liczba[ a ][ b ] == wylos_liczba[ m - 1 ][ p + 1 ] ) czy = true; } else if( msc_krata == 2 && msc_kratb == 2 ) { if( wylos_liczba[ a ][ b ] == wylos_liczba[ m ][ o ] || wylos_liczba[ a ][ b ] == wylos_liczba[ m ][ p ] || wylos_liczba[ a ][ b ] == wylos_liczba[ n ][ o ] || wylos_liczba[ a ][ b ] == wylos_liczba[ n ][ p ] ) czy = true; } else if( msc_krata == 2 && msc_kratb == 3 ) { if( wylos_liczba[ a ][ b ] == wylos_liczba[ n ][ o ] || wylos_liczba[ a ][ b ] == wylos_liczba[ n ][ o - 1 ] || wylos_liczba[ a ][ b ] == wylos_liczba[ m ][ o ] || wylos_liczba[ a ][ b ] == wylos_liczba[ m ][ o - 1 ] ) czy = true; } else if( msc_krata == 3 && msc_kratb == 2 ) { if( wylos_liczba[ a ][ b ] == wylos_liczba[ m ][ p ] || wylos_liczba[ a ][ b ] == wylos_liczba[ m - 1 ][ p ] || wylos_liczba[ a ][ b ] == wylos_liczba[ m ][ o ] || wylos_liczba[ a ][ b ] == wylos_liczba[ m - 1 ][ o ] ) czy = true; } else if( msc_krata == 3 && msc_kratb == 3 ) { if( wylos_liczba[ a ][ b ] == wylos_liczba[ m ][ o ] || wylos_liczba[ a ][ b ] == wylos_liczba[ m ][ o - 1 ] || wylos_liczba[ a ][ b ] == wylos_liczba[ m - 1 ][ o ] || wylos_liczba[ a ][ b ] == wylos_liczba[ m - 1 ][ o - 1 ] ) czy = true; } }
Po uruchomieniu zamiast 81 losowych cyfr z zakresu 1-9 pasujących w kolumnach poziomych pionowych i kratkach 3x3 mam 1 losową cyfrę i osiemdziesiąt dziewiątek. Znając życie jest to jakiś banalny problem który spowodowany był moim niedouczeniem. Dlatego jeśli ktoś byłby tak miły by mi wskazać ten problem byłbym mu oczywiście dozgonnie wdzięczny... I jak dałoby się skrócić zapis w funkcji "sprawdzenie". pozdROWienia //EDIT: Kod został lekko zmodyfikowany estetycznie wg. waszych rad |
|
malan |
» 2010-12-18 20:56:02 Może najpierw powiedz, co chcesz osiągnąć, bo patrząc na kod, to wydaje mi się, że chcesz wylosować 9 liczb z zakresu {1,...,9}, które nie będą się powtarzały w "poziomie", tak? Czyli np. 1 5 9 4 3 8 2 6 7 Tylko nie rozumiem, po co tyle kodu... |
|
Carlosss Temat założony przez niniejszego użytkownika |
» 2010-12-18 21:19:32 Widzę że nigdy nie spotkałeś się z nazwą sudoku. To jest tzw "czysta forma inteligencji" tak pisze na okładce "100 sudoku". Moja aplikacja ma na celu wygenerować przykładową tabelką sudoku 9x9 a na tej tabelce 9 mniejszych tabelek 3x3. Cyfry w tabelce nie mogą sie powtarzać poziomo, pionowo i w kratce 3x3 (to mniej wiecej sudoku)... Więcej info w google http://t2.gstatic.com/images?q=tbn:BRcWlSPSsg-DXM:http://s1.blomedia.pl/gadzetomania.pl/images/2010/11/Sudoku.gif&t=1 |
|
malan |
» 2010-12-18 22:02:13 Spotkałem się z nazwą Sudoku :). Nawet kiedyś je rozwiązywałem, wiesz? :) Zobaczyłem funkcję losowanie i za bardzo się na tym skupiłem ;p. Zapomniałem kompletnie, że temat tyczy się Sudoku. Co do tematu, to nie mogę się odnaleźć w Twoim kodzie... Za dużo zmiennych globalnych... ;p. Np. p = b + 1; - do czego ci ta zmienna, która równa jest w całym programie jeden(1)? |
|
ison |
» 2010-12-18 22:05:29 jeśli prawie zmienne których używasz do iteracji w for'ach deklarujesz globalnie to kod staje się mało czytelny, jeśli chcesz już koniecznie deklarować zmienne globalnie to nazywaj je sensownie |
|
Carlosss Temat założony przez niniejszego użytkownika |
» 2010-12-18 22:13:16 Czemu uważasz że w całym programie p=1? Możesz powiedzieć dlaczego? |
|
ison |
» 2010-12-18 22:17:20 bo podstawiasz tylko jednorazowo zapis int a = b + 1; nie oznacza że w całym programie zawsze zmienna a będzie większa od b o 1 |
|
VND |
» 2010-12-19 02:22:50 Usuń srand() poza funkcję losującą, najlepiej tak aby wykonała się tylko raz. W sytuacji jaką masz teraz wylosowana liczba będzie się zmieniać dopiero co sekundę. |
|
« 1 » 2 |