witam
Napisałem program, który rozwiązuje sudoku (czyt. powinien rozwiązywać), lecz coś nie wypaliło i nie mogę doszukać się błędu.
Dodam, że po włączeniu użycie procesora rośnie do 100%.
Widziałem, że na necie są opisane jakieś algorytmy do sudoku, ale chciałem to zrobić w ten sposób, czyli jakby "ręcznie".
Może ktoś dostrzeże błąd, którego ja nie widzę.
oto kod:
#include <stdio.h>
#define N 9
using namespace std;
//========================== deklaracje funkcji ==============================
bool czyWczesniej(int **macierz, int kolumna, int wiersz, int wartosc);
void wczytajDane (int **macierz, int ileDanych);
void wstawLiczbe (int **macierz, int wie, int kol, int wartosc);
void generuj (int **macierz);
void wyswietl(int **macierz);
//==============================================================================
int main(void)
{
int **macierz, ile;
macierz = new int* [N];
for(int i=0; i<N; ++i)
{
macierz[i] = new int [N];
}
//========= wyzerowanie macierzy ========
for(int i=0; i<N; ++i)
{
for(int j=0; j<N; ++j)
{
*( *(macierz + i) + j ) = 0;
}
}
printf("ilosc znanych cyfr: ");
scanf("%d",&ile);
wczytajDane(macierz,ile);
generuj (macierz);
wyswietl(macierz);
return 0;
}
//============ sprawdzenie, czy wartosc wystapila juz w kolumnie,wierszu lub 'kwadracie' ===========
bool czyWczesniej(int **macierz, int kolumna, int wiersz, int wartosc)
{
//============ przeszukanie kolumny ==============
for(int i=0; i<wiersz; ++i)
{
if( (* (* (macierz + i) + kolumna)) == (* (* (macierz + wiersz) + kolumna)) )
return true;
}
//============ przeszukanie wiersza ==============
for(int i=0; i<kolumna; ++i)
{
if( (* (* (macierz + wiersz) + i)) == (* (* (macierz + wiersz) + kolumna)) )
return true;
}
//=========== wyznaczenie polozenia poczatkowego elementu danego kwadratu =============
int wie_pocz = (wiersz/3)*3,
kol_pocz = (kolumna/3)*3;
//============ przeszukanie 'kwadratu' =============
for(int i=wie_pocz; i<(wie_pocz+3); ++i)
{
for(int j=kol_pocz; j<(kol_pocz+3); ++j)
{
if( (* (* (macierz + i) +j)) == (* (* (macierz + wiersz) + kolumna)) )
return true;
}
}
return false;
}
//============================== wczytanie znanych liczb =================================
void wczytajDane(int **macierz, int ile_danych)
{
int wie, kol;
for(int i=0; i < ile_danych; ++i)
{
printf("\npodaj wiersz oraz kolumne (oddziel spacja) ");
scanf("%d %d",&wie, &kol);
printf("\npodaj liczbe: ");
scanf("%d",((macierz + wie) + kol));
}
}
//=========================== wstawienie liczby do macierzy =============================
void wstawLiczbe(int **macierz, int wie, int kol, int wartosc)
{
(* (* (macierz + wie) + kol)) = wartosc;
}
//=============== wypelnienie macierzy liczbami zgodnymi z zalozeniami sudoku =============
void generuj(int **macierz)
{
int wartosc = 1;
for(int i=0; i < N; ++i)
{
for(int j=0; j < N; ++j)
{
while( czyWczesniej(macierz, j, i, wartosc))
{
++wartosc;
}
wstawLiczbe(macierz, i, j, wartosc);
wartosc = 1;
}
}
}
//========================== wyswietlenie wypelnionej macierzy =========================
void wyswietl(int **macierz)
{
for(int i=0; i < N; ++i)
{
for(int j=0; j < N; ++j)
{
printf("%d ", *( *( macierz + i ) + j));
}
printf("\n");
}
}
z góry dziękuję
pzdr.