Need some help for a sudoku solver ...

Discussion in 'C' started by axilleask, Nov 25, 2007.

  1. axilleask

    axilleask New Member

    Joined:
    Nov 11, 2007
    Messages:
    2
    Likes Received:
    0
    Trophy Points:
    0
    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
     
    Last edited by a moderator: Nov 25, 2007
  2. panayiotispatra

    panayiotispatra New Member

    Joined:
    Oct 25, 2007
    Messages:
    6
    Likes Received:
    0
    Trophy Points:
    0
    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");
    
    }
     
    Last edited by a moderator: Nov 28, 2007

Share This Page

  1. This site uses cookies to help personalise content, tailor your experience and to keep you logged in if you register.
    By continuing to use this site, you are consenting to our use of cookies.
    Dismiss Notice