#include <stdio.h>
#include <iostream>
#include <fstream>
#include <stdlib.h>
#define sudokuSize 9
std::ofstream plik( "sudoku.txt");
int sudokuTab[sudokuSize][sudokuSize] =
{
{0, 6, 0, 7, 2, 0, 0, 4, 0},
{5, 7, 0, 3, 0, 0, 0, 0, 0},
{0, 8, 0, 0, 1, 0, 0, 7, 0},
{6, 0, 8, 2, 3, 7, 0, 0, 0},
{0, 3, 7, 0, 0, 0, 2, 8, 0},
{0, 2, 0, 8, 0, 0, 0, 3, 0},
{0, 0, 0, 0, 7, 0, 0, 0, 0},
{7, 0, 0, 4, 0, 0, 0, 0, 1},
{0, 0, 0, 0, 6, 0, 0, 2, 0}
};
int constSudoku[sudokuSize][sudokuSize];
int licznik = 0;
//dekalracje funkcji
void rozwiaz();
int sprawdzKolizje(int row, int col, int n);
int czyMozna(int row, int col, int n);
void RozwiazSudoku(int row, int col);
//definicje funkcji
void rozwiaz()
{
licznik = 0;
RozwiazSudoku(0, 0);
std::cout << "Liczba rozwiazan sudoku: " << licznik << ".\n";
}
int sprawdzKolizje(int row, int col, int n)
{
int colision = 0;
int i = 0;
for( i= 0; i < sudokuSize;i++)
{
if (sudokuTab[row][i] == n || sudokuTab[i][col] == n)
return 1;
}
return colision;
}
int czyMozna(int row, int col, int n)
{
int czyMozna = 1;
int i =0;
int j = 0;
int rowSq = (row / 3);
int colSq = (col / 3);
int rowStart = (rowSq * 3);
int colStart = (colSq * 3);
for (i = rowStart; i < (rowStart + 3); i++)
{
for (j = colStart; j < (colStart + 3); j++)
{
if (sudokuTab[i][j] == n) return 0;
}
}
return czyMozna;
}
void RozwiazSudoku(int row, int col)
{
if ((sudokuTab[row][col] == 0) && (constSudoku[row][col] == 0)) // czy dane komurka sudoku jest wolna
{
int n = 0;
for (n = 1; n < 10; n++) // numry od 1...9
{
//sprawdzamy czy nie powoduje kolizji i czy mozna wstawiæ
if ((sprawdzKolizje(row, col, n) == 0) && czyMozna(row, col, n)==1) // jesli nie koluduje
{
sudokuTab[row][col] = n; // wstawiamy numerek
//to idziemy do next komórki
if ((row == (sudokuSize - 1)) && (col == (sudokuSize - 1))){
for (int i = 0;i < sudokuSize;i++)
{
for (int j = 0;j < sudokuSize;j++)
{
plik << sudokuTab[i][j];
}
}
plik<<"\n";
licznik++;
}
else if ((col + 1) < sudokuSize)
RozwiazSudoku(row, col + 1);
else if ((row + 1) < sudokuSize)
RozwiazSudoku(row + 1, 0);
sudokuTab[row][col] = 0;
}
}
}
else//idziemy do innej komórki
{
if ((col + 1) < sudokuSize)
RozwiazSudoku(row, col + 1);
else if ((row + 1) < sudokuSize)
RozwiazSudoku(row + 1, 0);
}
}
int main()
{
int i = 0;
int j = 0;
for (i = 0;i < sudokuSize;i++)
{
for (j = 0;j < sudokuSize;j++)
{
constSudoku[i][j] = sudokuTab[i][j];
}
}
rozwiaz();
plik.close();
system("PAUSE");
return 0;
}