Toggle navigation
Toggle navigation
This project
Loading...
Sign in
Shenlin
/
leetcode-test
Go to a project
Toggle navigation
Toggle navigation pinning
Projects
Groups
Snippets
Help
Project
Activity
Repository
Pipelines
Graphs
Issues
0
Merge Requests
0
Wiki
Snippets
Network
Create a new issue
Builds
Commits
Issue Boards
Authored by
lintry
2019-06-20 10:56:53 +0800
Browse Files
Options
Browse Files
Download
Email Patches
Plain Diff
Commit
eba2845b5953a54276a58d5449baf42e42912a93
eba2845b
1 parent
e433cbfe
add new test case
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
40 additions
and
37 deletions
37-solveSudoku.js
37-solveSudoku.js
View file @
eba2845
...
...
@@ -2,13 +2,13 @@
* @param {character[][]} board
* @return {void} Do not return anything, modify board in-place instead.
*/
var
solveSudoku
=
function
(
board
)
{
var
solveSudoku
=
function
(
board
)
{
let
empty
=
{};
let
rows
=
new
Array
(
9
).
fill
(
void
0
).
map
(()
=>
new
Set
());
let
cols
=
new
Array
(
9
).
fill
(
void
0
).
map
(()
=>
new
Set
());
let
blocks
=
new
Array
(
9
).
fill
(
void
0
).
map
(()
=>
new
Set
());
let
rows
=
new
Array
(
9
).
fill
(
void
0
).
map
(()
=>
new
Set
());
let
cols
=
new
Array
(
9
).
fill
(
void
0
).
map
(()
=>
new
Set
());
let
blocks
=
new
Array
(
9
).
fill
(
void
0
).
map
(()
=>
new
Set
());
for
(
let
i
=
0
;
i
<
9
;
i
++
)
{
for
(
let
i
=
0
;
i
<
9
;
i
++
)
{
for
(
let
j
=
0
;
j
<
9
;
j
++
)
{
let
block
=
block_no
(
i
,
j
);
let
v
=
board
[
i
][
j
];
...
...
@@ -16,55 +16,53 @@ var solveSudoku = function(board) {
rows
[
i
].
add
(
v
);
cols
[
j
].
add
(
v
);
blocks
[
block
].
add
(
v
);
mark
({
block
,
i
,
j
},
v
);
}
else
{
mark
({
block
,
i
,
j
},
v
);
}
mark
({
block
,
i
,
j
},
v
);
}
}
function
block_no
(
i
,
j
)
{
return
(
~~
(
i
/
3
))
*
3
+
~~
(
j
/
3
);
return
(
~~
(
i
/
3
))
*
3
+
~~
(
j
/
3
);
}
function
mark
({
block
,
i
,
j
},
v
)
{
for
(
let
n
=
0
;
n
<
9
;
n
++
)
{
// not empty cell
function
mark
({
block
,
i
,
j
},
v
)
{
for
(
let
n
=
0
;
n
<
9
;
n
++
)
{
//
skip self if is
not empty cell
if
((
i
===
n
||
j
===
n
)
&&
v
!==
'.'
)
{
if
(
empty
[
i
+
','
+
j
])
{
delete
empty
[
i
+
','
+
j
];
if
(
empty
[
i
+
','
+
j
])
{
delete
empty
[
i
+
','
+
j
];
}
continue
;
}
// cols
if
(
board
[
i
][
n
]
===
'.'
)
{
let
e
=
empty
[
i
+
','
+
n
]
=
empty
[
i
+
','
+
n
]
||
{
block
:
block_no
(
i
,
n
),
i
,
j
:
n
,
maybe
:
new
Set
([
'1'
,
'2'
,
'3'
,
'4'
,
'5'
,
'6'
,
'7'
,
'8'
,
'9'
])
};
e
.
maybe
.
delete
(
v
);
let
e
=
empty
[
i
+
','
+
n
]
=
empty
[
i
+
','
+
n
]
||
{
block
:
block_no
(
i
,
n
),
i
,
j
:
n
,
maybe
:
new
Set
([
'1'
,
'2'
,
'3'
,
'4'
,
'5'
,
'6'
,
'7'
,
'8'
,
'9'
])
};
e
.
maybe
.
has
(
v
)
&&
e
.
maybe
.
delete
(
v
);
if
(
!
e
.
maybe
.
size
)
{
delete
empty
[
i
+
','
+
n
];
delete
empty
[
i
+
','
+
n
];
}
}
// rows
if
(
board
[
n
][
j
]
===
'.'
)
{
let
e
=
empty
[
n
+
','
+
j
]
=
empty
[
n
+
','
+
j
]
||
{
block
:
block_no
(
n
,
j
),
i
:
n
,
j
,
maybe
:
new
Set
([
'1'
,
'2'
,
'3'
,
'4'
,
'5'
,
'6'
,
'7'
,
'8'
,
'9'
])
};
e
.
maybe
.
delete
(
v
);
let
e
=
empty
[
n
+
','
+
j
]
=
empty
[
n
+
','
+
j
]
||
{
block
:
block_no
(
n
,
j
),
i
:
n
,
j
,
maybe
:
new
Set
([
'1'
,
'2'
,
'3'
,
'4'
,
'5'
,
'6'
,
'7'
,
'8'
,
'9'
])
};
e
.
maybe
.
has
(
v
)
&&
e
.
maybe
.
delete
(
v
);
if
(
!
e
.
maybe
.
size
)
{
delete
empty
[
n
+
','
+
j
];
delete
empty
[
n
+
','
+
j
];
}
}
// blocks
let
bi
=
~~
(
block
/
3
);
let
bi
=
~~
(
block
/
3
);
let
bj
=
block
%
3
;
for
(
let
bn
=
0
;
bn
<
9
;
bn
++
)
{
let
i
=
bi
*
3
+
~~
(
bn
/
3
);
let
j
=
bj
*
3
+
bn
%
3
;
for
(
let
bn
=
0
;
bn
<
9
;
bn
++
)
{
let
i
=
bi
*
3
+
~~
(
bn
/
3
);
let
j
=
bj
*
3
+
bn
%
3
;
if
(
board
[
i
][
j
]
===
'.'
)
{
let
e
=
empty
[
i
+
','
+
j
]
=
empty
[
i
+
','
+
j
]
||
{
block
:
block_no
(
i
,
j
),
i
,
j
,
maybe
:
new
Set
([
'1'
,
'2'
,
'3'
,
'4'
,
'5'
,
'6'
,
'7'
,
'8'
,
'9'
])
};
e
.
maybe
.
delete
(
v
);
let
e
=
empty
[
i
+
','
+
j
]
=
empty
[
i
+
','
+
j
]
||
{
block
:
block_no
(
i
,
j
),
i
,
j
,
maybe
:
new
Set
([
'1'
,
'2'
,
'3'
,
'4'
,
'5'
,
'6'
,
'7'
,
'8'
,
'9'
])
};
e
.
maybe
.
has
(
v
)
&&
e
.
maybe
.
delete
(
v
);
if
(
!
e
.
maybe
.
size
)
{
delete
empty
[
i
+
','
+
j
];
delete
empty
[
i
+
','
+
j
];
}
}
}
...
...
@@ -73,7 +71,7 @@ var solveSudoku = function(board) {
function
fill
(
i
,
j
,
block
,
v
)
{
board
[
i
][
j
]
=
v
;
empty
[
i
+
','
+
j
].
value
=
v
;
empty
[
i
+
','
+
j
].
value
=
v
;
rows
[
i
].
add
(
v
);
cols
[
j
].
add
(
v
);
blocks
[
block
].
add
(
v
);
...
...
@@ -81,23 +79,25 @@ var solveSudoku = function(board) {
function
unfill
(
i
,
j
,
block
,
v
)
{
board
[
i
][
j
]
=
'.'
;
empty
[
i
+
','
+
j
].
value
=
void
0
;
empty
[
i
+
','
+
j
].
value
=
void
0
;
rows
[
i
].
delete
(
v
);
cols
[
j
].
delete
(
v
);
blocks
[
block
].
delete
(
v
);
}
function
deal
()
{
let
blanks
=
Object
.
keys
(
empty
).
map
(
k
=>
empty
[
k
]).
filter
(
m
=>!
m
.
value
).
sort
((
a
,
b
)
=>
{
// find empty cell order by maybe size
let
blanks
=
Object
.
keys
(
empty
).
map
(
k
=>
empty
[
k
]).
filter
(
e
=>
!
e
.
value
).
sort
((
a
,
b
)
=>
{
return
a
.
maybe
.
size
-
b
.
maybe
.
size
;
});
for
(
let
e
of
blanks
)
{
let
{
block
,
i
,
j
,
value
}
=
e
;
if
(
value
)
{
continue
;}
let
{
block
,
i
,
j
,
value
}
=
e
;
if
(
value
)
{
continue
;
}
// maybe signed
let
union
=
new
Set
([...
rows
[
i
],
...
cols
[
j
],
...
blocks
[
block
]]);
let
maybe
=
new
Set
([
'1'
,
'2'
,
'3'
,
'4'
,
'5'
,
'6'
,
'7'
,
'8'
,
'9'
].
filter
(
v
=>!
union
.
has
(
v
)));
let
maybe
=
new
Set
([
'1'
,
'2'
,
'3'
,
'4'
,
'5'
,
'6'
,
'7'
,
'8'
,
'9'
].
filter
(
v
=>
!
union
.
has
(
v
)));
// empty cell must has some maybe number
if
(
!
maybe
.
size
)
{
return
false
;
}
...
...
@@ -127,6 +127,9 @@ var solveSudoku = function(board) {
deal
();
};
var
sudoku
=
[[
"5"
,
"3"
,
"."
,
"."
,
"7"
,
"."
,
"."
,
"."
,
"."
],[
"6"
,
"."
,
"."
,
"1"
,
"9"
,
"5"
,
"."
,
"."
,
"."
],[
"."
,
"9"
,
"8"
,
"."
,
"."
,
"."
,
"."
,
"6"
,
"."
],[
"8"
,
"."
,
"."
,
"."
,
"6"
,
"."
,
"."
,
"."
,
"3"
],[
"4"
,
"."
,
"."
,
"8"
,
"."
,
"3"
,
"."
,
"."
,
"1"
],[
"7"
,
"."
,
"."
,
"."
,
"2"
,
"."
,
"."
,
"."
,
"6"
],[
"."
,
"6"
,
"."
,
"."
,
"."
,
"."
,
"2"
,
"8"
,
"."
],[
"."
,
"."
,
"."
,
"4"
,
"1"
,
"9"
,
"."
,
"."
,
"5"
],[
"."
,
"."
,
"."
,
"."
,
"8"
,
"."
,
"."
,
"7"
,
"9"
]];
// var sudoku = [["5", "3", ".", ".", "7", ".", ".", ".", "."], ["6", ".", ".", "1", "9", "5", ".", ".", "."], [".", "9", "8", ".", ".", ".", ".", "6", "."], ["8", ".", ".", ".", "6", ".", ".", ".", "3"], ["4", ".", ".", "8", ".", "3", ".", ".", "1"], ["7", ".", ".", ".", "2", ".", ".", ".", "6"], [".", "6", ".", ".", ".", ".", "2", "8", "."], [".", ".", ".", "4", "1", "9", ".", ".", "5"], [".", ".", ".", ".", "8", ".", ".", "7", "9"]];
var
sudoku
=
[[
"."
,
"6"
,
"."
,
"5"
,
"9"
,
"3"
,
"."
,
"."
,
"."
],[
"9"
,
"."
,
"1"
,
"."
,
"."
,
"."
,
"5"
,
"."
,
"."
],[
"."
,
"3"
,
"."
,
"4"
,
"."
,
"."
,
"."
,
"9"
,
"."
],[
"1"
,
"."
,
"8"
,
"."
,
"2"
,
"."
,
"."
,
"."
,
"4"
],[
"4"
,
"."
,
"."
,
"3"
,
"."
,
"9"
,
"."
,
"."
,
"1"
],[
"2"
,
"."
,
"."
,
"."
,
"1"
,
"."
,
"6"
,
"."
,
"9"
],[
"."
,
"8"
,
"."
,
"."
,
"."
,
"6"
,
"."
,
"2"
,
"."
],[
"."
,
"."
,
"4"
,
"."
,
"."
,
"."
,
"8"
,
"."
,
"7"
],[
"."
,
"."
,
"."
,
"7"
,
"8"
,
"5"
,
"."
,
"1"
,
"."
]];
console
.
time
();
solveSudoku
(
sudoku
);
console
.
info
(
sudoku
);
console
.
timeEnd
();
...
...
Please
register
or
login
to post a comment