Update all.c

main
po79yr3at 2 years ago
parent 4fe8442cd6
commit f938b95b0e

133
all.c

@ -2,40 +2,18 @@
#include<stdlib.h> #include<stdlib.h>
#include<time.h> #include<time.h>
#define range9(x) for(int x = 0; x < 9; x ++) #define range9(x) for(int x = 0; x < 9; x ++)
#define range81() for(int i = 0; i < 9; i ++) for(int j = 0; j < 9; j ++)
struct Sudoku{ struct Sudoku{
int inc[9][9]; int inc[9][9];
}; };
#define MAXSIZE 1000 #define MAXSIZE 1000
struct Sudoku *M_PtrReg[MAXSIZE]; struct Sudoku M_Sudoku[MAXSIZE];
int PRtp = 0; int tp=0;
void ptrInit(){
for(int i = 0; i < MAXSIZE; i ++)
M_PtrReg[i] = (struct Sudoku *)malloc(sizeof(struct Sudoku));
}
void ptrClear(){
for(int i = 0; i < MAXSIZE; i ++)
free(M_PtrReg[i]);
}
struct Sudoku *ptrReg(){return M_PtrReg[PRtp++];}
void ptrFree(){--PRtp;}
void sudokuClear(struct Sudoku *a){ void sudokuClear(struct Sudoku *a){range81()a->inc[i][j] = 0;}
range9(i) void sudokuCopy(struct Sudoku src, struct Sudoku *dst){range81()dst->inc[i][j] = src.inc[i][j];}
range9(j) void sudokufromArray(int src[9][9], struct Sudoku *dst){range81()dst->inc[i][j] = src[i][j];}
a->inc[i][j] = 0;
}
void sudokuCopy(struct Sudoku src, struct Sudoku *dst){
range9(i)
range9(j)
dst->inc[i][j] = src.inc[i][j];
}
void sudokufromArray(int src[9][9], struct Sudoku *dst){
range9(i)
range9(j)
dst->inc[i][j] = src[i][j];
}
void sudokuPrint(struct Sudoku a){ void sudokuPrint(struct Sudoku a){
range9(i){ range9(i){
if(!(i % 3)) putchar('\n'); if(!(i % 3)) putchar('\n');
@ -54,19 +32,18 @@ void sudokuPrint(struct Sudoku a){
void initRandomSeed(){srand(time(NULL));} void initRandomSeed(){srand(time(NULL));}
struct Sudoku sudokuRandomGenerate(unsigned int fill){// % struct Sudoku sudokuRandomGenerate(unsigned int fill){// %
fill %= 101; fill %= 101;
struct Sudoku *res = ptrReg(); struct Sudoku *res = M_Sudoku + tp++;
range9(i) range81()
range9(j) if(rand()%100 <= fill)
if(rand()%100 <= fill) res->inc[i][j] = rand() % 9 + 1;
res->inc[i][j] = rand() % 9 + 1; else
else res->inc[i][j] = 0;
res->inc[i][j] = 0;
return *res; return *res;
} }
struct Sudoku tags; struct Sudoku tags;
int tag(struct Sudoku *a, int i, int j, int x, int y, struct Sudoku *tags){ int tag(struct Sudoku *a, int i, int j, int x, int y, struct Sudoku *tags){
if(i == x && j == y) return 0; if(i == x && j == y) return 0;
if(a->inc[i][j] == a->inc[x][y]){ if(a->inc[i][j] && a->inc[i][j] == a->inc[x][y]){
printf("False:repetition found in (%d,%d) and (%d,%d) with the number {%d}\n", i+1, j+1, x+1, y+1, a->inc[x][y]); printf("False:repetition found in (%d,%d) and (%d,%d) with the number {%d}\n", i+1, j+1, x+1, y+1, a->inc[x][y]);
return 1; return 1;
} }
@ -80,13 +57,11 @@ int tagPoint(struct Sudoku *a, int i, int j, struct Sudoku *tags){
return 0; return 0;
} }
int tagsInit(struct Sudoku *a, struct Sudoku *tags){ int tagsInit(struct Sudoku *a, struct Sudoku *tags){
range9(i) range81()
range9(j) tags->inc[i][j] |= (1 << a->inc[i][j]);
tags->inc[i][j] |= (1 << a->inc[i][j]); range81()
range9(i) if(a->inc[i][j] && tagPoint(a, i, j, tags))
range9(j) return 1;
if(a->inc[i][j] && tagPoint(a, i, j, tags))
return 1;
} }
int sudokuJudge(struct Sudoku a){ int sudokuJudge(struct Sudoku a){
struct Sudoku tags; struct Sudoku tags;
@ -97,45 +72,43 @@ int sudokuJudge(struct Sudoku a){
} }
void tagFindLeast(struct Sudoku *a, int *x, int *y, struct Sudoku *tags){ void tagFindLeast(struct Sudoku *a, int *x, int *y, struct Sudoku *tags){
int minv = 10; int minv = 10;
int mini=0, minj=0; *x = *y = 0;
range9(i) range81()
range9(j) if(!(a->inc[i][j])){
if(!a->inc[i][j]){ int cnt = 0;
int cnt = 0; range9(k)
range9(k) cnt += !((tags->inc[i][j] >> (k+1)) & 1);
cnt += (tags->inc[i][j] >> k) & 1; if(cnt < minv && cnt != 0)
if(cnt < minv && cnt != 0){ minv = cnt,
minv = cnt; *x = i,
mini = i; *y = j;
minj = j; }
}
}
*x = mini;
*y = minj;
} }
struct Sudoku *sudokuFill__(struct Sudoku *a, int unfillednum, struct Sudoku *tags){ struct Sudoku *sudokuFill__(struct Sudoku *a, int unfillednum, struct Sudoku *tags){
struct Sudoku *pres, *t_tags; struct Sudoku *pres, *t_tags;
if(!unfillednum){ if(!unfillednum){
pres = ptrReg(); pres = M_Sudoku + tp ++;
sudokuCopy(*a, pres); sudokuCopy(*a, pres);
sudokuPrint(*tags); sudokuPrint(*a);
return pres; return pres;
} }
int m=0, n=0; int m=0, n=0;
tagFindLeast(a, &m, &n, tags); tagFindLeast(a, &m, &n, tags);
range9(i) range9(i)
if(!((tags->inc[m][n] >> i) & 1)){ if(!((tags->inc[m][n] >> (i+1)) & 1)){
a->inc[m][n] = i; t_tags = M_Sudoku + tp ++;
t_tags = ptrReg();
sudokuCopy(*tags, t_tags); sudokuCopy(*tags, t_tags);
a->inc[m][n] = i+1;
tagPoint(a, m, n, t_tags); tagPoint(a, m, n, t_tags);
// printf("step:%d:[%d %d]:%d\n", unfillednum, m+1, n+1, i+1);
// sudokuPrint(*a); // sudokuPrint(*a);
// getchar(); // getchar();
pres = sudokuFill__(a, unfillednum - 1, t_tags); pres = sudokuFill__(a, unfillednum - 1, t_tags);
if(pres) if(pres)
return pres; return pres;
a->inc[m][n] = 0; a->inc[m][n] = 0;
ptrFree(); tp --;
} }
return NULL; return NULL;
} }
@ -144,33 +117,39 @@ struct Sudoku *sudokuFill(struct Sudoku *a){
sudokuClear(&tags); sudokuClear(&tags);
if(tagsInit(a, &tags)) return NULL; if(tagsInit(a, &tags)) return NULL;
int unfillednum = 0; int unfillednum = 0;
range9(i) range81()
range9(j) if(!a->inc[i][j])
if(!a->inc[i][j]) unfillednum ++;
unfillednum ++;
printf("%d", unfillednum);
return sudokuFill__(a, unfillednum, &tags); return sudokuFill__(a, unfillednum, &tags);
} }
int main(){ int main(){
ptrInit(); clock_t st, end;
st=clock();
initRandomSeed(); initRandomSeed();
int board[9][9] = {{5, 3, 0, 0, 7, 0, 0, 0, 0},
{6, 0, 0, 1, 9, 5, 0, 0, 0},
{0, 9, 8, 0, 0, 0, 0, 6, 0},
{8, 0, 0, 0, 6, 0, 0, 0, 3},
{4, 0, 0, 8, 0, 3, 0, 0, 1},
{7, 0, 0, 0, 2, 0, 0, 0, 6},
{0, 6, 0, 0, 0, 0, 2, 8, 0},
{0, 0, 0, 4, 1, 9, 0, 0, 5},
{0, 0, 0, 0, 8, 0, 0, 7, 9}};
struct Sudoku a; struct Sudoku a;
sudokuCopy(sudokuRandomGenerate(10), &a); sudokufromArray(board, &a);
printf("The original Sudoku matrix: \n"); printf("The original Sudoku matrix: \n");
sudokuPrint(a); sudokuPrint(a);
if(sudokuJudge(a)){ if(sudokuJudge(a)){
printf("No solution\n"); printf("No solution!\n");
ptrClear();
return 0; return 0;
} }
struct Sudoku *pres = sudokuFill(&a); struct Sudoku *pres = sudokuFill(&a);
if(!pres){ if(!pres){
printf("No solution\n"); printf("No solution!\n");
ptrClear();
return 0; return 0;
} }
printf("The solution of Sudoku matrix:\n"); printf("The solution of Sudoku matrix:\n");
sudokuPrint(*pres); sudokuPrint(*pres);
printf("%d", PRtp); end=clock();
ptrClear(); printf("dur:%ldms\n", end-st);
} }
Loading…
Cancel
Save