Go4Expert

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/)

axilleask 25Nov2007 21:48

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 11:27.