matematykaszkolna.pl
cudoku Mariusz: program sudoku; uses crt; type plansza=array[1..9,1..9]of byte; function wypelnij(var sudoku: plansza):boolean {Tutaj zmienne lokalne itp} begin {Tutaj ciało funkcji Funkcja zwraca prawdę jeśli da się jednoznacznie wypełnić tablice} end; var i,j,wartosc:byte; esc:char; sudoku: plansza; begin end. Jak napisać tę funkcję wypełniającą tablice
14 lis 12:22
jc: Zwykłe przeszukiwanie z powrotami jest wystarczająco szybkie. Mam kody w pythonie i jawie.
14 lis 12:54
Mariusz: Masz tam jedną funkcję ? Ciekaw jestem jak taka funkcja wygląda
14 lis 13:18
jc: Cały program: def test(x,y,r,tab): for k in range(9): if tab[x][k]==r or tab[k][y]==r: return 0 a=x−x%3 b=y−y%3 for i in range(a,a+3): for j in range(b, b+3): if tab[i][j]==r: return 0 return 1 def pole(tab): for x in range(9): for y in range(9): if tab[x][y]==0: break if tab[x][y]==0: break if tab[x][y]: for i in range(9): print tab[i] print else: for r in range(1,10): if test(x,y, r,tab): tab[x][y]=r pole(tab) tab[x][y]=0 tab=[] for i in range(9): tab.append(input()) pole(tab) −−−− Przykładowe dane [0,0,6,0,0,0,0,0,1] [0,7,0,0,6,0,0,5,0] [8,0,0,1,0,3,2,0,0] [0,0,5,0,4,0,8,0,0] [0,4,0,7,0,2,0,9,0] [0,0,8,0,1,0,7,0,0] [0,0,1,2,0,5,0,0,3] [0,6,0,0,7,0,0,8,0] [2,0,0,0,0,0,4,0,0]
14 lis 13:56
Mariusz: Czy na pewno kod dobrze przepisany Jak ja go przepisywałem to wystąpił błąd
15 lis 07:39
Dziadek Mróz: Mariusz, zmień print ... na print(...) Pewnie korzystasz z Pythona 3+ jc ma kod w Pythonie 2.x
15 lis 14:32
Mariusz: Mam 2.5.1 Możliwe że źle wpisywałem Ciekawe jak to przepisać na język kompilowany taki jak Pascal czy C
15 lis 19:57
Mariusz: Próbowałem przepisać ten kod na C i coś mi nie wyszło #include<stdio.h> int test(int x,int y,int r,int tab[9][9] ) { int k,a,b,i,j; for(k=0;k<9;k++) if(tab[x][k]==r||tab[k][y]==r) return 0; a=x−x%3; b=y−y%3; for(i=a;i<a+3;i++) { for(j=b;j<b+3;j++) if(tab[i][j]==r) return 0; } return 1; } void pole(int tab[9][9]) { int x,y,i,j,r; for(x=0;x<9;x++) { for(y=0;y<9;y++) if(tab[x][y]==0) break; if(tab[x][y]==0) break; } if(tab[x][y]) { for(i=0;i<9;i++) { for(j=0;j<9;j++) printf("%d ",tab[i][j]); printf("\n"); } } else{ for(r=1;r<10;r++) if(test(x,y,r,tab)) { tab[x][y]=r; pole(tab); tab[x][y]=0; } } } int main(char argc, char** argv) { FILE *in; int i,j; int tab[9][9]; if ((in = fopen(argv[1], "rt")) == NULL) { fprintf(stderr, "Cannot open input file.\n"); return 1; } while(!feof(in)) { for(i=0;i<9;i++) for(j=0;j<9;j++) fscanf(in,"%d",&tab); } pole(tab); fclose(in); return 0; }
16 lis 09:02
Dziadek Mróz: http://pastebin.com/cprwszuF Nie sprawdzałem czy działa, tym się sam zajmij bo znasz ten kod Linia 75: fscanf(in,"%d",&tab); fscanf(in,"%d",&tab[i][j]);
16 lis 15:53
Mariusz: Nie wiem jak mogłem nie zauważyć tego Próbowałem zamienić pętle aby pozbyć się instrukcji break ale to nic nie dało Nawet po poprawnym wczytaniu tablicy nie osiąga tego fragmentu kodu w którym następuje wypisanie tablicy Jak ty byś przełożył te funkcje które podał jc na C Kod w C można skompilować i nie jest potrzebny interpreter ani maszyna wirtualna
16 lis 21:53
jc: Mariusz, czy zamieniłeś minusy na prawdziwe? Masz kod w C++, ale to jest chyba inny kod. −−− #include<iostream> using namespace std; int tab[9][9]; int test(int x, int y, int r){ for(int k=0; k<9; k++) if( tab[x][k] == r or tab[k][y] == r ) return 0; int a=x−x%3, b=y−y%3; for( int i=a; i<a+3; i++) for( int j=b; j<b+3; j++) if( tab[i][j] == r ) return 0; return 1; } void pole(int x, int y){ while( tab[x][y] ) if( x < 8 ) x++; else if( y < 8 ) { x=0; y++; } else break; if( tab[x][y] ) for( int i=0; i<9; i++){ for( int j=0; j<9; j++) cout << tab[i][j] <<" "; cout << endl; } else for( int r=1; r<=9; r++) if( test(x,y,r) ){ tab[x][y]=r; pole(x,y); tab[x][y]=0; } } int main(){ for(int i=0; i<9; i++) for(int j=0; j<9; j++) cin >> tab[i][j]; pole(0,0); }
16 lis 22:15
Mariusz: Właśnie zamieniałem te pętle z instrukcjami break na pętlę while ale nic nie wychodziło bo nie zauważyłem tego błędu przy wczytywaniu tablicy który wskazał Dziadek #include<stdio.h> int test(int x,int y,int r,int tab[9][9] ) { int k,a,b,i,j; for(k=0; k<9; k++) if(tab[x][k]==r||tab[k][y]==r) return 0; a=x−x%3; b=y−y%3; for(i=a; i<a+3; i++) { for(j=b; j<b+3; j++) if(tab[i][j]==r) return 0; } return 1; } void pole(int tab[9][9]) { int x,y,i,j,r,p; p=0; while((p<81)&&tab[p/9][p%9]) { p++; } if(p<81) { x=p/9; y=p%9; } if(tab[x][y]) { for(i=0; i<9; i++) { for(j=0; j<9; j++) printf("%d ",tab[i][j]); printf("\n"); } printf("\n"); } else { for(r=1; r<10; r++) if(test(x,y,r,tab)) { tab[x][y]=r; pole(tab); tab[x][y]=0; } } } int main(char argc, char** argv) { FILE *in; int i,j; int tab[9][9]; if ((in = fopen(argv[1], "rt")) == NULL) { fprintf(stderr, "Cannot open input file.\n"); return 1; } while(!feof(in)) { for(i=0; i<9; i++) for(j=0; j<9; j++) fscanf(in,"%d",&tab[i][j]); pole(tab); } fclose(in); return 0; } Mnie udało się do czegoś takiego dojść Tylko nie wiem czemu ostatnią tablicę wyświetla dwa razy
17 lis 09:54
Mariusz: jc programowałeś kiedyś w Pascalu ? Pascal nie ma modułu do obsługi listy a by się ona mi przydała blok danych powinien zawierać pola numer:longint; linia:string; Węzeł powinien zawierać także wskaźniki na następny węzeł i opcjonalnie na poprzedni węzeł
17 lis 10:06
jc: Być może umieściłem wersję, która znajduje wszystkie rozwiązania (a nie jedno). Listy. Chcesz się nauczyć, jak zaprogramować? czy chcesz używać? Jak chcesz używać, to znajdź język, bibliotekę, ... , gdzie będziesz miał to, co chcesz. Chcesz listy w Pascalu − na pewno są w książce Wirtha.
17 lis 10:47
Mariusz: Gdybym się nauczył jak ją zaprogramować to mógłbym w każdej chwili dostosować do własnych potrzeb więc to chyba byłaby najlepsza opcja W Pascalu jest ograniczenie pamięciowe na tablice więc jest to jeszcze jeden argument za listą chociaż pewne operacje na liście wykonywane są wolniej
17 lis 12:16
jc: Widocznie tablica jest tworzona na stosie. Możesz przy kompilacji powiększyć pamięć dla stosu. Pewnie można umieszczać tablice w innym miejscu.
17 lis 16:11
17 lis 16:53
Mariusz: Na potrzeby tego programu tablica wystarczy w zupełności ale gdybyśmy chcieli napisać jakiś program gdzie musielibyśmy współpracować z plikiem czy napisać programik taki jak książka telefoniczna , przechowujący dane o studentach czy o książkach w bibliotece Nie wiem jak to jest w najnowszym Free Pascalu ale w TP7 ograniczenie na tablice to 640KB i jest to chyba związane z pamięcią konwencjonalną dostępną w DOSie
17 lis 18:26
Dziadek Mróz: W Pascalu masz rekordy a w C masz struktury
17 lis 18:37