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