witam. Dostalem zadanie napisania kodu rozwiązującego proste sudoku. Oto treść:
Program powinien zapytać o nazwę pliku z zadaniem (z rozszerzeniem .sud) oraz wyświetlić je. Następnie powinien znaleźć rozwiązanie i wydrukować je na ekranie oraz zapisać w pliku o podanej przez użytkownika nazwie. W przypadku, gdy rozwiązanie nie istnieje, należy wypisać odpowiedni komunikat. Program nie powinien się wieszać lub kończyć błędnie nawet, gdy podawane dane nie są poprawne (plik z zadaniem nie istnieje lub jest niepoprawny).
Oto moj kod:
#include <fstream>
using namespace std;
class sudoku
{
private:
int sud[9][9];
int kolumna_nowa;
int wiersz_nowy;
int wiersz;
int kolumna;
int wartosc;
public:
bool zero(int wiersz,int kolumna);
bool powtarza(int wiersz,int kolumna,int wartosc);
void wybiera(int wiersz,int kolumna);
sudoku(istream & dane);
};
sudoku::sudoku(istream & dane){
for (int wiersz=0 ; wiersz < 9 ; ++wiersz){
for (int kolumna=0 ; kolumna < 9 ; ++kolumna){
char znak;
dane >> znak;
sud[wiersz][kolumna] = znak == '-' ? 0 : znak - '0';
}
}
for (int wiersz=0 ; wiersz < 9 ; ++wiersz)
{
for (int kolumna=0 ; kolumna < 9 ; ++kolumna){
cout << sud[wiersz][kolumna];
}
cout << "\n";
}
cout << "\n";
}
bool sudoku::zero(int wiersz,int kolumna){
if(sud[wiersz][kolumna]==0){return true;}
else{return false;}
}
bool sudoku::powtarza(int wiersz,int kolumna,int wartosc){
for(int i=0; i<9; ++i){
if(sud[i][kolumna]==wartosc || sud[wiersz][i]==wartosc)
{return true;}
}
int wiersz_pocz=(wiersz/3)*3;
int kolumna_pocz=(kolumna/3)*3;
for(int i=wiersz_pocz; i<wiersz_pocz+2; ++i){
for(int i=kolumna_pocz; i<kolumna_pocz+2; ++i){
if(sud[wiersz_pocz][i]==wartosc){return true;}
}
}
return false;
}
void sudoku::wybiera(int wiersz, int kolumna) {
for (int r=0; r<9; ++r){
if (powtarza (wiersz,kolumna,r)==false)
{sud[wiersz][kolumna]=r; break;}
else {
kolumna_nowa = kolumna;
wiersz_nowy = wiersz;
if(kolumna_nowa != 0)
{ kolumna_nowa--;}
if(kolumna_nowa == 0 && wiersz_nowy == 0)
{kolumna_nowa = wiersz_nowy == 0;}
else{wiersz_nowy --; kolumna_nowa=8;}
wybiera(wiersz_nowy,kolumna_nowa);}
}
for (int wiersz=0 ; wiersz < 9 ; ++wiersz){
for (int kolumna=0 ; kolumna < 9 ; ++kolumna){
cout << sud[wiersz][kolumna];
}
cout << "\n";
}
cout << "\n";
}
int main()
{
ifstream plik;
std::string nazwa;
cout<<"podaj nazwe pliku";
cin>>nazwa;
plik.open(nazwa.c_str());
sudoku sudoku1(plik);
for(int i=0; i<1; ++i){
for(int j=0; j<4; ++j){
sudoku1.wybiera(i,j);
}
}
system("pause");
return(0);
}
Program sie kompiluje, ale po wyświetleniu diagramu sudoku, które ma być rozwiązanie, zawiesza się:
Unhandled exception at 0x00411769 in po_kolei.exe: 0xC00000FD: Stack overflow.
Ktos wie może co powoduje ten bład i w jaki sposób go należy rozwiązać?