Witam. Staram się nauczyć programowania, poznałem język c++ dopiero 3 miesiące temu. Na zadanie z uczelni mam napisać algorytm rozwiązujący sudoku, którego fragment wczytuję z pliku tekstowego. Niestety nie mogę poradzić sobie z problemem. Wczytuję tablicę dwuwymiarową [9][9] z liczbami, jednak wyświetla mi się 81 zer. Plik tekstowy wrzucony do folderu z .exe mojego programu. Litościwą duszę proszę o zerknięcie i ew. trafne uwagi.
#include <iostream>
#include <fstream>
#include <cmath>
using namespace std;
int plansza[9][9];
int zgraj()
{
const char* filename = "sudoku.txt";
ifstream rozwiazanie(filename);
while(rozwiazanie.is_open())
{
for(int i = 0; i<9 ;i++)
{ // pętla zgrywająca dane do pliku
for(int j=0; j<9 ;j++)
{
rozwiazanie >> plansza[i][j];
}
}
return plansza[9][9];
}
rozwiazanie.close();
}
bool wiersz(int a, int b, int c) //a- nr wiersza, b - nr kolumny, c - wpisywana liczba
{
for (int i = 0; i<9; i++){ //funkcja sprawdza, czy w wierszu mamy już taką wartość
if(plansza[a][i] == c) //jeśli liczba wpisywana do sudoku jest już obecna w danym wierszu, to funkcja jest fałszywa
return 0;
return 1;
}
}
bool kolumna(int a, int b, int c){
for (int i = 0; i<9; i++)
{
if(plansza[i][b] == c)
return 0;
return 1;
}
}
bool kwadrat(int a, int b, int c)
{
int row = ceil((a+1)/3.0);
int column = ceil((b+1)/3.0);// z kropką, żeby była liczba zmiennoprzecinkowa a nie całkowita
for (int i=(row-1)*3; i<row*3+3; i++){
for (int j=(column-1)*3; j<column*3+3; j++){
if(plansza[i][j] == c){
return 0;}
return 1;
}
}
}
int main(){
int puste = 0; //puste miejsca
int tmp;
bool b=1;
//const char* filename = "sudoku";
//ifstream rozwiazanie(filename);
//for(int i = 0; i<9 ;i++)
//{ // pętla zgrywająca dane do pliku
//for(int j=0; j<9 ;j++)
//{
//rozwiazanie >> plansza[i][j];
//if(plansza[i][j]==0){ //tutaj sprawdzamy, czy w tablicy są jakieś zera, czyli puste miejsca
// puste++;} //jeśli są, zwiekszamy zmienną oznaczającą te puste miejsca o 1
//}
//}
//cout << puste<<endl;
zgraj();
for(int i = 0; i<9;i++)
{
for(int j=0;j<9;j++)
{
cout << plansza[i][j] << " ";
if (plansza[i][j]==0)
puste ++;
}
cout<< endl;
}
while(puste && b) //b =1 i istnieją puste miejsca
{
b=0; //jeśli cała plansza będzie już wypełniona (lub nie da się jej wypełnić), to nam pozwoli zakończyć pętlę
//i zakończyć planszę
for(int i = 0; i<9 ;i++)
{ //tutaj sprawdzamy, którym polem w planszy mamy się zająć, zaczynamy od pola tab[0][0];
for(int j=0; j<9 ;j++)
{
if(plansza[i][j]) //jeśli dane pole jest równe 0(czyli puste) to próbujemy wpisać tam liczbę (dalsza część kodu)
continue; //jeśli w planszy znajdziemy już wpisaną jakąś liczbę np. 7, to przeskakujemy całą pętlę
// i zaczynamy sprawdzanie dla kolejnego pola w planszy
tmp = 0;
for(int k=1;k<10; k++)
{ //żebyśmy mogli wpisać liczbę od 1 do 9; 0 oznacza lukę, czyli brak cyfry
if(wiersz(i,j,k) && kolumna(i,j,k) && kwadrat(i,j,k))
{ //tutaj sprawdzamy, czy cyfra jest już gdzieś w danej kolumnie wierszu albo kwadracie 3x3
if(!tmp)
{ //jeśli miejsce jest puste i w danej kolumnie, wierszu i polu nie występuje liczba k
tmp=k; //to ustawiamy wartość zmiennej na tę liczbę
}
else
{ //jeśli jest inaczej
tmp =0; //tmp jest nadal równa 0
break; //zatem przerywamy pętlę i sprawdzamy planszę dla kolejnego k
}
}
}
if(tmp!=0)
{ //jeśli sprawdziliśmy już wszystko i zmienna tmp wciąż pzredstawia wartość
plansza[i][j] = tmp; //to wpisujemy tę wartośc na dane pole w planszy
b=1; //b=1, więc pętla wykona się jeszcze raz dla kolejnego pola
puste--; //pętla while będzie się wykonywać, dopóki będą puste miejsca
}
} // kończąca do for(int j = 0; j<9;j++){
} // kończąca do for(int i=0;i<9;i++){
} // kończąca do while
if(!b) //b==0, zatem plansza została pomyślnie rozwiązana
{
cout << "Sudoku rozwiazane!" << endl;
for(int i = 0; i<9;i++)
{
for(int j=0;j<9;j++)
{
cout << plansza[i][j] << " ";
}
cout<< endl;
}
}
else if(!puste) // nie ma pustych miejsc, zatem planszy rozwiązać się nie da
{
cout << "Sudoku nie da sie rozwiazac!" << endl;
}
system("pause");
return 0;
}