Prośba o pomoc w rozwiązaniu problemu z sudoku

0

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;
}

0

Wczytanie powinno wyglądać tak:

const int SudokuSize = 9;

bool wczytajSudoku(const char *fileName) {
    ifstream f(fileName);
    if (!f.is_open())
        return false;
    for(int i = 0; i<SudokuSize ;i++) {
        for(int j=0; j<SudokuSize; j++) {
            f >> plansza[i][j];
        }
    }
    return f.good();
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1