Hello, I would like to ask you for help with this program, it should open file with sudoku soubor.txt
Code:
65 7 2 93
7 6
365
9 85 13 2
5 2 7
4 68 39 5
936
3 9
59 2 7 34
After it should be able to solve sudoku and print it into file output.txt
Here is code:
Code:
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
const int SUDOKU_UNKNOWN_VALUE = 0;
const int FULL_ROW = (9 + 8 + 7 + 6 + 5 + 4 + 3 + 2 + 1);
typedef struct Sudoku
{
int values[9][9];
int unknown_count;
}Sudoku;
typedef int Row[9];
typedef Row* pRow;
bool sudoku_isInputNumberValid(char cisloDoSudoku) {
const char nejmensiPlatneCisloChar = '1';
const char nejvetsiPlatneCisloChar = '9';
return cisloDoSudoku <= nejvetsiPlatneCisloChar &&
cisloDoSudoku >= nejmensiPlatneCisloChar;
}
int convertCharToNumber(char number) {
return number - '0';
}
Sudoku* sudoku_init() {
Sudoku* sudoku = malloc(sizeof(Sudoku));
for (int y = 0; y < 9; y++) {
for (int x = 0; x < 9; x++) {
sudoku->values[y][x] = SUDOKU_UNKNOWN_VALUE;
sudoku->unknown_count = 81;
}
}
return sudoku;
}
void sudoku_nactiZeSouboru(char* fileName, Sudoku* sudoku) {
FILE *fileHandle;
if ((fileHandle = fopen(fileName, "r")) == NULL) {
perror("Error opening file");
exit(EXIT_FAILURE);
}
for (int y = 0; y < 9; y++)
{
for (int x = 0; x < 10; x++)
{
char nactenyZnakZeVstupu = fgetc(fileHandle);
if(nactenyZnakZeVstupu == '\n') {
break;
}else if(nactenyZnakZeVstupu == ' ') {
continue;
}
if(!sudoku_isInputNumberValid(nactenyZnakZeVstupu)) {
perror("Chybny vstup. Cislo neni cislo. :-(");
exit(EXIT_FAILURE);
}
if(x>9) {
perror("Podivne, vstup prosel validaci, ale jsme v 10 sloupci. Mate v souboru spravny pocet sloupcu?");
exit(EXIT_FAILURE);
}
sudoku->values[y][x] = convertCharToNumber(nactenyZnakZeVstupu);
}
}
fclose(fileHandle);
}
void sudoku_print(char* outputFile, Sudoku* sudoku) {
FILE *filePrinter;
if ((filePrinter = fopen(outputFile, "w")) != NULL)
{
//fputc(c,filePrinter);//...WHY?
for (int y = 0; y < 9; y++) {
for (int x = 0; x < 9; x++) {
if(sudoku->values[y][x]==0){
printf(" ");
fprintf(filePrinter," ");
}
else {
printf("%d", sudoku->values[y][x]);
fprintf(filePrinter, "%d", sudoku->values[y][x]);
}
}
printf("\n");
fprintf(filePrinter, "\n");
}
fclose(filePrinter);
}
}
/*
Returns just an array of missing numbers
10-th member is count of mi
*/
int* diagnoseRow(Row row){
int* missed = malloc(sizeof(int)*10);
memset(missed, 0, 10*sizeof(int));
int count = 0;
int numbers[] = {1,2,3,4,5,6,7,8,9};
for(int i = 0; i < 9; i++)
{
if(row[i] == 0){
missed[count] = i;
count++;
}else{
for(int o=0;o<9;o++){
if(numbers[o]==row[i])
numbers[o] = -1;
}
}
}
missed[9] = count;
count = 0;
for(int o=0;o<9;o++){
if(numbers[o]!=-1) {
missed[count] = numbers[o];
count++;
}
}
return missed;
}
//Evaluates how much missing numbers there still is (isn't)
void updateCount(Sudoku* sudoku)
{
int count = 0;
for(int i=0;i<9;i++)
{
int* row = diagnoseRow(sudoku->values[i]);
count += row[9];
}
}
//trivial check for last number which can be simply filled in
void lastNCheck(pRow row)
{
int ucount = 0;
int index = -1;
int sum = FULL_ROW;
int reach = sum;
for(int i = 0; i < 9; i++)
{
if((*row)[i] == SUDOKU_UNKNOWN_VALUE)
{
ucount++;
index = i;
}
else{
reach -= (*row)[i];
}
}
if(ucount==1)
{
(*row)[index] = reach;
}
}
void row_procedure(pRow row)
{
lastNCheck(row);
int* mn = diagnoseRow(*row);
//...
//more procedures...
//...
free(mn);
}
Sudoku transpose(Sudoku sudoku)
{
Sudoku outputSud;
for(int p = 0; p < 9; p++) {
for(int q = 0;q < 9; q++) {
outputSud.values[p][q] = sudoku.values[q][p];
}
}
outputSud.unknown_count = sudoku.unknown_count;
return outputSud;
}
//Algoritmus bude potreba trochu dotunit
void sudoku_resolve(Sudoku* sudoku) {
//do {
for(int p = 0; p < 9; p++) {
row_procedure(&(sudoku->values[p]));
for(int q = 0;q < 9; q++) {
Sudoku tr = transpose(*sudoku);//transponuje
row_procedure(&(tr.values[q]));//vyresi sloupec, resp. radek
tr = transpose(tr);//transponuje zpet
*sudoku = tr;//ulozi do sudoka
}
}
updateCount(sudoku);
//} while (sudoku->unknown_count > 0);
}
int main() {
// 0) Inicializace
Sudoku* sudoku = sudoku_init();
// 1) načtu soubor
sudoku_nactiZeSouboru("soubor.txt", sudoku);
// 2) vyřeším
sudoku_resolve(sudoku);
// 3) zkusím to vypsat
sudoku_print("output.txt", sudoku);
return 0;
}