1
1
function solveSudoku ( board : string [ ] [ ] ) : void {
2
- // const spaces: [number, number][] = [];
3
- const spaces : number [ ] = [ ] ; //new Set<number>();
2
+ const spaces : number [ ] = [ ] ;
4
3
const rows = new Array ( 9 ) . fill ( 0 ) . map ( ( ) => number_char_set ( false ) ) ;
5
4
const columns = new Array ( 9 ) . fill ( 0 ) . map ( ( ) => number_char_set ( false ) ) ;
6
5
const subboxes = new Array ( 3 )
@@ -10,12 +9,7 @@ function solveSudoku(board: string[][]): void {
10
9
for ( let j = 0 ; j < 9 ; j ++ ) {
11
10
const char = board [ i ] [ j ] ;
12
11
if ( char === "." ) {
13
- // if (Math.random() - 0.5 > 0) {
14
12
spaces . push ( pair_to_index ( i , j ) ) ;
15
- // spaces.add(pair_to_index(i, j));
16
- // } else {
17
- // spaces.unshift([i, j]);
18
- // }
19
13
} else {
20
14
rows [ i ] [ char ] = true ;
21
15
columns [ j ] [ char ] = true ;
@@ -27,64 +21,7 @@ function solveSudoku(board: string[][]): void {
27
21
return ;
28
22
}
29
23
30
- // const space_to_charscount: Map<number, number> = new Map();
31
- // while (true) {
32
- // let stop = true;
33
- // spaces = spaces.filter((index) => {
34
- // const [row, column] = index_to_pair(index);
35
- // const chars = get_available_chars(
36
- // row,
37
- // column,
38
- // rows,
39
- // columns,
40
- // subboxes
41
- // );
42
- // if (chars.length === 1) {
43
- // const char = chars[0];
44
- // board[row][column] = chars[0];
45
- // rows[row][char] = true;
46
- // columns[column][char] = true;
47
- // subboxes[Math.floor(row / 3)][Math.floor(column / 3)][char] =
48
- // true;
49
- // stop = false;
50
- // space_to_charscount.delete(index);
51
- // return false;
52
- // }
53
- // space_to_charscount.set(index, chars.length);
54
- // return true;
55
- // });
56
- // if (stop) break;
57
- // }
58
- // if (spaces.length === 0) {
59
- // return;
60
- // }
61
- // //排序可选数最少的空格
62
- // spaces.sort(
63
- // (a, b) =>
64
- // (space_to_charscount.get(a) ?? 0) -
65
- // (space_to_charscount.get(b) ?? 0)
66
- // );
67
- // const sorted: [number, number, Array<string>][] = spaces
68
- // .map(
69
- // ([row, column]) =>
70
- // [row, column, get_available_chars(row, column)] as [
71
- // number,
72
- // number,
73
- // Array<string>
74
- // ]
75
- // )
76
- // .sort((a, b) => -a[2].length + b[2].length);
77
- // spaces.length = 0;
78
- // for (const [row, column] of sorted) {
79
- // spaces.push([row, column]);
80
- // }
81
-
82
24
dfs ( new Set ( spaces ) , rows , columns , subboxes , board ) ;
83
- // if (result) {
84
- // for (const [row, column, char] of result) {
85
- // board[row][column] = char;
86
- // }
87
- // }
88
25
return ;
89
26
}
90
27
function index_to_pair ( index : number ) : [ number , number ] {
@@ -113,14 +50,11 @@ function dfs(
113
50
subboxes : Record < string , boolean > [ ] [ ] ,
114
51
board : string [ ] [ ] ,
115
52
) : boolean {
116
- // console.log(spaces);
117
53
if ( spaces . size === 0 ) {
118
54
return true ;
119
55
}
120
56
const spaces_and_chars : [ number , number , string [ ] ] [ ] = [ ] ;
121
- // let count = 0;
122
57
for ( const index of spaces ) {
123
- // if (count > 10) break;
124
58
const [ row , column ] = index_to_pair ( index ) ;
125
59
const chars = get_available_chars ( row , column , rows , columns , subboxes ) ;
126
60
if ( chars . length === 0 ) {
@@ -134,17 +68,9 @@ function dfs(
134
68
if ( chars . length === 1 ) {
135
69
break ;
136
70
}
137
-
138
- // count++;
139
71
}
140
- // Array.from(spaces).map(function (index) {
141
-
142
- // });
143
72
let [ i , j , chars ] = spaces_and_chars [ 0 ] ;
144
- //查找可选数最少的空格
145
- // let countcount = 0;
146
73
for ( const [ r , c , h ] of spaces_and_chars ) {
147
- // if (countcount > 10) break;
148
74
if ( h . length === 0 ) {
149
75
return false ;
150
76
}
@@ -155,31 +81,11 @@ function dfs(
155
81
if ( chars . length === 1 ) {
156
82
break ;
157
83
}
158
- // countcount++;
159
84
}
160
85
if ( chars . length === 0 ) {
161
86
return false ;
162
87
}
163
- // const clonedspaces = new Set(spaces);
164
- // clonedspaces.delete(pair_to_index(i, j));
165
- // const clonedspaces = spaces.filter(([r, c]) => !(r == i && c == j));
166
-
167
- // if (pos < 0) {
168
- // return true;
169
- // }
170
- // const [i, j, chars] = sorted[pos];
171
- // const chars =
172
-
173
- // Array.from({ length: 9 })
174
- //.map((_v, i) => String(i + 1))
175
- // .sort(() => Math.random() - 0.5);
176
88
for ( const char of chars . sort ( ( ) => Math . random ( ) - 0.5 ) ) {
177
- // if (
178
- // !rows[i][char] &&
179
- // !columns[j][char] &&
180
- // !subboxes[Math.floor(i / 3)][Math.floor(j / 3)][char]
181
- // ) {
182
-
183
89
rows [ i ] [ char ] = true ;
184
90
185
91
columns [ j ] [ char ] = true ;
@@ -190,8 +96,6 @@ function dfs(
190
96
spaces . delete ( pair_to_index ( i , j ) ) ;
191
97
const result = dfs (
192
98
spaces ,
193
- // clonedspaces,
194
-
195
99
rows ,
196
100
columns ,
197
101
subboxes ,
@@ -204,7 +108,6 @@ function dfs(
204
108
columns [ j ] [ char ] = false ;
205
109
subboxes [ Math . floor ( i / 3 ) ] [ Math . floor ( j / 3 ) ] [ char ] = false ;
206
110
spaces . add ( pair_to_index ( i , j ) ) ;
207
- // }
208
111
}
209
112
return false ;
210
113
}
@@ -229,107 +132,3 @@ function get_available_chars(
229
132
return Array . from ( charset ) ;
230
133
}
231
134
export default solveSudoku ;
232
- // export default function solveSudoku(board: string[][]): void {
233
- // const spaces: [number, number][] = [];
234
-
235
- // const rows = new Array(9).fill(0).map(() => number_char_set(false));
236
- // const columns = new Array(9).fill(0).map(() => number_char_set(false));
237
- // const subboxes = new Array(3)
238
- // .fill(0)
239
- // .map(() => new Array(3).fill(0).map(() => number_char_set(false)));
240
- // for (let i = 0; i < 9; i++) {
241
- // for (let j = 0; j < 9; j++) {
242
- // const char = board[i][j];
243
- // if (char === ".") {
244
- // // if (Math.random() - 0.5 > 0) {
245
- // spaces.push([i, j]);
246
- // // } else {
247
- // // spaces.unshift([i, j]);
248
- // // }
249
- // } else {
250
- // rows[i][char] = true;
251
- // columns[j][char] = true;
252
- // subboxes[Math.floor(i / 3)][Math.floor(j / 3)][char] = true;
253
- // }
254
- // }
255
- // }
256
- // if (spaces.length === 0) {
257
- // return;
258
- // }
259
- // const sorted: [number, number, Array<string>][] = spaces
260
- // .map(
261
- // ([row, column]) =>
262
- // [row, column, get_available_chars(row, column)] as [
263
- // number,
264
- // number,
265
- // Array<string>,
266
- // ],
267
- // )
268
- // .sort((a, b) => -a[2].length + b[2].length);
269
- // // spaces.length = 0;
270
- // // for (const [row, column] of sorted) {
271
- // // spaces.push([row, column]);
272
- // // }
273
-
274
- // function get_available_chars(row: number, column: number): Array<string> {
275
- // const array = Array.from({ length: 9 }).map((_v, i) => String(i + 1));
276
- // const charset = new Set(array);
277
- // for (const char of array) {
278
- // if (
279
- // rows[row][char] ||
280
- // columns[column][char] ||
281
- // subboxes[Math.floor(row / 3)][Math.floor(column / 3)][char]
282
- // ) {
283
- // charset.delete(char);
284
- // }
285
- // }
286
- // return Array.from(charset);
287
- // }
288
- // function dfs(pos: number): boolean {
289
- // if (pos < 0) {
290
- // return true;
291
- // }
292
- // const [i, j, chars] = sorted[pos];
293
- // // const chars =
294
-
295
- // // Array.from({ length: 9 })
296
- // //.map((_v, i) => String(i + 1))
297
- // // .sort(() => Math.random() - 0.5);
298
- // for (const char of chars.sort(() => Math.random() - 0.5)) {
299
- // if (
300
- // !rows[i][char] &&
301
- // !columns[j][char] &&
302
- // !subboxes[Math.floor(i / 3)][Math.floor(j / 3)][char]
303
- // ) {
304
- // rows[i][char] = true;
305
- // columns[j][char] = true;
306
- // subboxes[Math.floor(i / 3)][Math.floor(j / 3)][char] = true;
307
-
308
- // board[i][j] = char;
309
- // if (dfs(pos - 1)) {
310
- // return true;
311
- // }
312
- // rows[i][char] = false;
313
- // columns[j][char] = false;
314
- // subboxes[Math.floor(i / 3)][Math.floor(j / 3)][char] = false;
315
- // }
316
- // }
317
- // return false;
318
- // }
319
-
320
- // dfs(spaces.length - 1);
321
- // return;
322
- // }
323
- // function number_char_set(def: boolean): Record<string, boolean> {
324
- // return {
325
- // 1: def,
326
- // 2: def,
327
- // 3: def,
328
- // 4: def,
329
- // 5: def,
330
- // 6: def,
331
- // 7: def,
332
- // 8: def,
333
- // 9: def,
334
- // };
335
- // }
0 commit comments