Go4Expert (http://www.go4expert.com/)
-   C (http://www.go4expert.com/forums/c/)
-   -   Need some help for a sudoku solver ... (http://www.go4expert.com/forums/help-sudoku-solver-t7534/)

Need some help for a sudoku solver ...

Hi all

I have made this program that meant to read sudoku puzzles from file, solve them and then write the solution to file.

My problem is that when I try to write the solved puzzle on file no file is created.
I am stuck at this point..

My code is below..
Code:

```/* Sudoku Solver  */ #include <stdlib.h> #include <stdio.h> #include <string.h> /* S=3 for standard 9x9 sudoku, max. S=4  */ #define S 2 #define N (S*S) /*  loop with last not included */ #define loop(_I,_From,_To) for (_I=_From;_I<_To;_I++) /* loop with last included */ #define loopto(_I,_From,_To) for (_I=_From;_I<=_To;_I++) #define Error(X) do { fprintf(stderr,"ERROR %s\n",X); exit(1); } while(0) typedef signed char sudoku_t[N][N]; int valid(int x,int y,int k,sudoku_t s) /* returns 1 if char k can be put to s[x][y] */ {   int i,j,x0,y0;   loop (i,0,N) if (s[i][y]==k) return 0;   loop (j,0,N) if (s[x][j]==k) return 0;   x0=S*(x/S);   y0=S*(y/S);   loop (i,x0,x0+S)     loop (j,y0,y0+S) if (s[i][j]==k) return 0;   return 1; } void line(char *s) /* 1 grid line */ {   int i;   loop (i,0,N)     printf("%c%c%c%c",s[i%S!=0],s[1],s[1],s[1]);   putchar(s[0]);   putchar('\n'); } void prints(sudoku_t s, char *filename) /* print sudoku s */ {         /* File pointers to the input file and the outputfile */     FILE *fp;   int x,y; printf("Saving %s...", filename);         // sanity check - game file has to exist and be writable. if ((fp = fopen(filename,"w")) == NULL) {                 printf("Output file cannot be written!\n");                 return 0;         } else   loop (x,0,N) {     line(x%S?"| ":"+-");     loop (y,0,N)       fprintf(fp,"%c %c ",             y%S?' ':'|',             s[x][y]?s[x][y]<=9?s[x][y]+'0':s[x][y]+'@':' ');     fputs("|",fp); }   line("+-");   // write end of line         fprintf(fp, "\n");     }     /* Close the output file */     fclose (fp); int nsol=0; void recursive_search(sudoku_t s) /*   scans sudoku for an empty field and tries to put a number 1..N there   if successfull, calls recursive_search again */ {   int x,y,k;   loop (x,0,N) loop (y,0,N) {     if (s[x][y]==0) {       loopto (k,1,N) if (valid(x,y,k,s)) {         /* s[x][y]=k is valid, so let's do it and try next */         sudoku_t news;         memcpy(news,s,sizeof(sudoku_t));         news[x][y]=k;         recursive_search(news); }       /* no digit fits s[x][y], so giving up... */       return; } }   /* none of s[x][y] is empty ==> we have a solution */   nsol++;   prints(s); } int main(int argc ,char **arg) {   FILE *fp;   sudoku_t s;   int x,y;   char line[128];   if (argc<2) {           fprintf(stderr,"%dx%d Usage:\n\   sudoku {FILE|-}\n\ where FILE (- = stdin) has %d lines by %d chars\n\ 1 char = {1234} for 4x4, {1..9} for 9x9, {1..9,A..P} for 16x16\n\ SPACE or 0 denotes a char to find\n\     }     else fp=fopen(arg[1],"rt");   if (!fp) Error(arg[1]);     prints(s);   recursive_search(s);   printf("%d solution%s found\n",nsol,"s"+(nsol==1));   return 0; }```
any help will be greatly appreciated :D

 panayiotispatra 28Nov2007 02:36

Re: Need some help for a sudoku solver ...

Code:

```void writePuzzle(sudoku_t s, char *filename) {         /* File pointers to the input file and the outputfile */     FILE *fp;         int i,j;         printf("Saving %s...", filename);         // sanity check - game file has to exist and be writable.         if ((fp = fopen(filename,"w")) == NULL) {                 errorandexit("Output file cannot be written!\n");         }     for (i=0; i<N; i++) {         for (j=0; j<N; j++) {                         /*                         * write a number at-a-time to the file. We utilize abs()                         * in order to remove the sign that indicates locked numbers                         */             fprintf(fp, "%d ", sudoku[i][j]);         }         // write end of line         fprintf(fp, "\n");     }     /* Close the output file */     fclose (fp);     printf("Done\n"); }```

 All times are GMT +5.5. The time now is 19:06.