From d9002eb94a2f6dcb07b4869303068416b4e5590a Mon Sep 17 00:00:00 2001 From: Teruaki Kawashima Date: Wed, 16 Dec 2009 11:53:36 +0000 Subject: sudoku: fix FS#7772: Sudoku: "Solve" Crash. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@24024 a1c6a512-1295-4272-9138-f99709370657 --- apps/plugins/sudoku/generator.c | 31 +++++++++++++++++++++++++++++++ apps/plugins/sudoku/generator.h | 1 + apps/plugins/sudoku/sudoku.c | 19 ++++++++++++++++--- 3 files changed, 48 insertions(+), 3 deletions(-) diff --git a/apps/plugins/sudoku/generator.c b/apps/plugins/sudoku/generator.c index 59bb9066cc..ba74fa5b08 100644 --- a/apps/plugins/sudoku/generator.c +++ b/apps/plugins/sudoku/generator.c @@ -1153,3 +1153,34 @@ bool sudoku_generate_board(struct sudoku_state_t* state, char** difficulty) *difficulty = classify( ); return true; } + +bool sudoku_solve_board(struct sudoku_state_t* state) +{ + bool ret; + int r,c,i; + + reset( ); + i=0; + for (r=0;r<9;r++) { + for (c=0;c<9;c++) { + if( state->startboard[r][c]!='0' ) + { + fill( i, state->startboard[r][c] - '0' ); + } + i++; + } + } + + ret = ( 0 == solve( ) && 81 == idx_history ); + + if (ret) { + i=0; + for (r=0;r<9;r++) { + for (c=0;c<9;c++) { + state->currentboard[r][c]='0'+GET_DIGIT( board[ i ] ); + i++; + } + } + } + return ret; +} diff --git a/apps/plugins/sudoku/generator.h b/apps/plugins/sudoku/generator.h index 3caa98ee19..222a9247b2 100644 --- a/apps/plugins/sudoku/generator.h +++ b/apps/plugins/sudoku/generator.h @@ -1 +1,2 @@ bool sudoku_generate_board(struct sudoku_state_t* state, char** difficulty); +bool sudoku_solve_board(struct sudoku_state_t* state); diff --git a/apps/plugins/sudoku/sudoku.c b/apps/plugins/sudoku/sudoku.c index 99b08f21a9..9e7e969eee 100644 --- a/apps/plugins/sudoku/sudoku.c +++ b/apps/plugins/sudoku/sudoku.c @@ -283,6 +283,10 @@ static unsigned int cellypos[9]={ #define YOFS ((LCD_HEIGHT-BOARD_HEIGHT)/2) #endif +#define BLOCK 3 +#define SIZE (BLOCK*BLOCK) + +#if 0 /****** Solver routine by Tom Shackell Downloaded from: @@ -295,9 +299,6 @@ Released under GPLv2 typedef unsigned int Bitset; -#define BLOCK 3 -#define SIZE (BLOCK*BLOCK) - #define true 1 #define false 0 @@ -569,6 +570,18 @@ void sudoku_solve(struct sudoku_state_t* state) return; } +#endif /* 0 */ + +void sudoku_solve(struct sudoku_state_t* state) +{ + bool ret = sudoku_solve_board(state); + + if (!ret) { + rb->splash(HZ*2, "Solve failed"); + } + + return; +} /* Copies the current to the saved board */ static void save_state(struct sudoku_state_t *state) -- cgit v1.2.3