Skip to content

Commit 1206463

Browse files
committed
solve func + changes in check legal value
1 parent 44dd80b commit 1206463

6 files changed

+62
-28
lines changed

files_utils.c

+17-11
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,6 @@ int read_file_to_board (Board* board, char* path){
4444

4545
fptr = fopen(path,'r');
4646
if(fptr ==NULL){
47-
printf("Error: invalid file\n");
4847
fclose(fptr);
4948
return 0;
5049
}
@@ -62,7 +61,6 @@ int read_file_to_board (Board* board, char* path){
6261
}
6362
}
6463
if(count<2){
65-
printf("Error: invalid file\n");
6664
fclose(fptr);
6765
return 0;
6866
}
@@ -82,28 +80,36 @@ int read_file_to_board (Board* board, char* path){
8280
}
8381
if(count_scan != 0){
8482
if(value > size || value < 1){
85-
printf("Error: invalid file\n");
8683
fclose(fptr);
8784
return 0;
8885
}
8986
if(count_dot == 1){
90-
board->fixed_board[i][j]=value;
91-
}
92-
else{
9387
if(value == 0){
94-
board->cur_board[i][j]=BOARD_NULL_VALUE;
95-
}
88+
board->fixed_board[i][j]=BOARD_NULL_VALUE;
89+
}
9690
else{
97-
board->cur_board[i][j]=value;
91+
if(is_legal(i,j,value,board,1)){
92+
board->fixed_board[i][j]=value;
93+
}
94+
else{
95+
fclose(fptr);
96+
return 0;
97+
}
9898
}
9999
}
100+
if(value == 0){
101+
board->cur_board[i][j]=BOARD_NULL_VALUE;
102+
}
103+
else{
104+
board->cur_board[i][j]=value;
105+
if(count_dot == 0){board->count_filled++;}; /*not fixed*/
106+
}
100107
if(j!=size-1){j++;}
101108
else{i++;j=0;}
102109
}
103110
}
104111
if(i!=size){
105-
printf("Error: invalid file\n");
106-
fclose(fptr);
112+
fclose(fptr);
107113
return 0;
108114
}
109115
fclose(fptr);

sudoku_board.c

+21-11
Original file line numberDiff line numberDiff line change
@@ -3,50 +3,54 @@
33
#include <math.h>
44

55
/* all functions in this file get 0<=x,y<=row*col-1 */
6+
/* if is_fix == 1 value from fixed_board else from cur*/
67

7-
int get_value(int x, int y, Board* board){
8-
return (board->cur_board)[x][y];
8+
int get_value(int x, int y, Board* board, int is_fix){
9+
if(is_fix==0){
10+
return (board->cur_board)[x][y];
11+
}
12+
return (board->fixed_board)[x][y];
913
}
1014

1115
/* return 1 if value was found in row*/
12-
int value_in_row(int row, int value, Board* board){
16+
int value_in_row(int row, int value, Board* board, int is_fix){
1317
int i;
1418
int size = (board->num_of_rows)*(board->num_of_columns);
1519
for (i=0; i<size; i++){
16-
if(get_value(row,i,board) == value)
20+
if(get_value(row,i,board,is_fix) == value)
1721
return 1;
1822
}
1923
return 0;
2024
}
2125

2226
/* return 1 if value was found in col*/
23-
int value_in_col(int col, int value, Board* board){
27+
int value_in_col(int col, int value, Board* board,int is_fix){
2428
int i;
2529
int size = (board->num_of_rows)*(board->num_of_columns);
2630
for (i=0; i<size; i++){
27-
if(get_value(i,col,board) == value)
31+
if(get_value(i,col,board,is_fix) == value)
2832
return 1;
2933
}
3034
return 0;
3135
}
3236

3337
/* return 1 if value was found in square*/
34-
int value_in_square(int row, int col, int value, Board* board){
38+
int value_in_square(int row, int col, int value, Board* board,int is_fix){
3539
int i,j;
3640
int top_left_corner_row = floor(row/board->num_of_rows)*board->num_of_rows;
3741
int top_left_corner_col = floor(col/board->num_of_columns)*board->num_of_columns;
3842
for(i= top_left_corner_row; i<top_left_corner_row+board->num_of_rows; i++){
3943
for(j= top_left_corner_col; j<top_left_corner_col+board->num_of_columns; j++){
40-
if(get_value(i,j,board) == value)
44+
if(get_value(i,j,board,is_fix) == value)
4145
return 1;
4246
}
4347
}
4448
return 0;
4549
}
4650

47-
int set_value(int x, int y, int value, Board* board){
48-
if((value_in_row(x,value,board) || value_in_col(y,value,board) || value_in_square(x,y,value,board) ))
49-
return 0;
51+
int set_value(int x, int y, int value, Board* board,int is_fix){
52+
if(is_legal(x,y,value,board,is_fix)==0){
53+
return 0;}
5054
board->cur_board[x][y] = value;
5155
board->count_filled++;
5256
return 1;
@@ -73,3 +77,9 @@ int create_empty_board(Board* board, int rows, int columns) {
7377

7478
return 1;
7579
}
80+
81+
int is_legal(int x, int y, int value, Board* board, int is_fix){
82+
if((value_in_row(x,value,board,is_fix) || value_in_col(y,value,board,is_fix) || value_in_square(x,y,value,board,is_fix) ))
83+
return 0;
84+
return 1;
85+
}

sudoku_board.h

+2-1
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,9 @@ typedef struct _Board {
2121
} Board;
2222

2323
int set_value(int x, int y, int value, Board* board);
24-
int get_value(int x, int y, Board* board);
24+
int get_value(int x, int y, Board* board, int fixed_board);
2525
int erase_value(int x, int y, Board* board);
2626
int create_empty_board(Board* board, int rows, int columns);
27+
int is_legal(int x, int y, int value, Board* board, int is_fix);
2728

2829
#endif

sudoku_board_actions.c

+18-2
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
#include "backtracking_core_logic.h"
44
#include "puzzle_generator.h"
55
#include "2d_array_utils.h"
6+
#include "files_utils.h"
67

78
void print_board(Board* board){
89
int a, b, c, d;
@@ -22,7 +23,7 @@ void print_board(Board* board){
2223
for(c = 0; c < board->num_of_rows; c++){
2324
for(d = 0; d < board->num_of_columns; d++){
2425
col = d + c*board->num_of_columns;
25-
value = get_value(row,col,board);
26+
value = get_value(row,col,board,0);
2627
if(board->fixed_board[row][col] != BOARD_NULL_VALUE){
2728
printf(" %2d.",value);
2829
}
@@ -69,7 +70,7 @@ int set_value_user(int x, int y, int value, Board* board){
6970
print_board(board);
7071
return 0;
7172
}
72-
if(set_value(x-1,y-1,value,board) == 0 && board->cur_board[x-1][y-1]!=value){
73+
if(set_value(x-1,y-1,value,board,0) == 0 && board->cur_board[x-1][y-1]!=value){
7374
printf("Error: value is invalid\n");
7475
return 0;
7576
}
@@ -157,3 +158,18 @@ void seed(int seed) {
157158
srand(seed);
158159
}
159160

161+
void solve(Board* board, char* path){
162+
int succeeded;
163+
succeeded = read_file_to_board(board,path);
164+
if(succeeded == 0){
165+
printf("Error: invalid file\n");
166+
board->mode = INIT;
167+
/*dont have to clean board still in INIT mode*/
168+
}
169+
else{
170+
board->mode=SOLVE;
171+
}
172+
}
173+
174+
void edit(Board* board, char* path); //read
175+
void save(Board* board, char* path); //write

sudoku_board_actions.h

+3-3
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@ void exit_game(Board* board);
1515
void seed(int seed);
1616
int is_filled(Board* board);
1717

18-
void solve(Board* board, char* path); //read
19-
void edit(Board* board, char* path); //read
20-
void save(Board* board, char* path); //write
18+
void solve(Board* board, char* path);
19+
void edit(Board* board, char* path);
20+
void save(Board* board, char* path);
2121

2222
#endif

tasks.txt

+1
Original file line numberDiff line numberDiff line change
@@ -12,3 +12,4 @@ nofar
1212

1313
both
1414
1. כל הפקודות החדשות - בהתאם לחלוקת המשימות
15+
2. סידור main ומהלך ריצה תקין

0 commit comments

Comments
 (0)