Skip to content

Commit b7c2194

Browse files
committedFeb 21, 2022
feat: add solutions to lc problem: No.0773
No.0773.Sliding Puzzle
1 parent 2392171 commit b7c2194

File tree

5 files changed

+657
-1
lines changed

5 files changed

+657
-1
lines changed
 

‎solution/0700-0799/0773.Sliding Puzzle/README.md

+221
Original file line numberDiff line numberDiff line change
@@ -58,22 +58,243 @@
5858

5959
<!-- 这里可写通用的实现逻辑 -->
6060

61+
BFS 最小步数模型。
62+
6163
<!-- tabs:start -->
6264

6365
### **Python3**
6466

6567
<!-- 这里可写当前语言的特殊实现逻辑 -->
6668

6769
```python
70+
class Solution:
71+
def slidingPuzzle(self, board: List[List[int]]) -> int:
72+
t = [None] * 6
73+
74+
def gets():
75+
for i in range(2):
76+
for j in range(3):
77+
t[i * 3 + j] = str(board[i][j])
78+
return ''.join(t)
79+
80+
def setb(s):
81+
for i in range(2):
82+
for j in range(3):
83+
board[i][j] = int(s[i * 3 + j])
84+
85+
def next():
86+
def find0():
87+
for i in range(2):
88+
for j in range(3):
89+
if board[i][j] == 0:
90+
return (i, j)
91+
return (0, 0)
6892

93+
res = []
94+
i, j = find0()
95+
for a, b in [[0, -1], [0, 1], [1, 0], [-1, 0]]:
96+
x, y = i + a, j + b
97+
if 0 <= x < 2 and 0 <= y < 3:
98+
board[i][j], board[x][y] = board[x][y], board[i][j]
99+
res.append(gets())
100+
board[i][j], board[x][y] = board[x][y], board[i][j]
101+
return res
102+
103+
start = gets()
104+
end = "123450"
105+
if start == end:
106+
return 0
107+
vis = set([(start)])
108+
q = deque([(start)])
109+
ans = 0
110+
while q:
111+
ans += 1
112+
for _ in range(len(q), 0, -1):
113+
x = q.popleft()
114+
setb(x)
115+
for y in next():
116+
if y == end:
117+
return ans
118+
if y not in vis:
119+
vis.add(y)
120+
q.append(y)
121+
return -1
69122
```
70123

71124
### **Java**
72125

73126
<!-- 这里可写当前语言的特殊实现逻辑 -->
74127

75128
```java
129+
class Solution {
130+
private String[] t = new String[6];
131+
private int[][] board;
132+
133+
public int slidingPuzzle(int[][] board) {
134+
this.board = board;
135+
String start = gets();
136+
String end = "123450";
137+
if (end.equals(start)) {
138+
return 0;
139+
}
140+
Set<String> vis = new HashSet<>();
141+
Deque<String> q = new ArrayDeque<>();
142+
q.offer(start);
143+
vis.add(start);
144+
int ans = 0;
145+
while (!q.isEmpty()) {
146+
++ans;
147+
for (int n = q.size(); n > 0; --n) {
148+
String x = q.poll();
149+
setb(x);
150+
for (String y : next()) {
151+
if (y.equals(end)) {
152+
return ans;
153+
}
154+
if (!vis.contains(y)) {
155+
vis.add(y);
156+
q.offer(y);
157+
}
158+
}
159+
}
160+
}
161+
return -1;
162+
}
163+
164+
private String gets() {
165+
for (int i = 0; i < 2; ++i) {
166+
for (int j = 0; j < 3; ++j) {
167+
t[i * 3 + j] = String.valueOf(board[i][j]);
168+
}
169+
}
170+
return String.join("", t);
171+
}
172+
173+
private void setb(String s) {
174+
for (int i = 0; i < 2; ++i) {
175+
for (int j = 0; j < 3; ++j) {
176+
board[i][j] = s.charAt(i * 3 + j) - '0';
177+
}
178+
}
179+
}
180+
181+
private int[] find0() {
182+
for (int i = 0; i < 2; ++i) {
183+
for (int j = 0; j < 3; ++j) {
184+
if (board[i][j] == 0) {
185+
return new int[]{i, j};
186+
}
187+
}
188+
}
189+
return new int[]{0, 0};
190+
}
191+
192+
private List<String> next() {
193+
int[] p = find0();
194+
int i = p[0], j = p[1];
195+
int[] dirs = {-1, 0, 1, 0, -1};
196+
List<String> res = new ArrayList<>();
197+
for (int k = 0; k < 4; ++k) {
198+
int x = i + dirs[k];
199+
int y = j + dirs[k + 1];
200+
if (x >= 0 && x < 2 && y >= 0 && y < 3) {
201+
swap(i, j, x, y);
202+
res.add(gets());
203+
swap(i, j, x, y);
204+
}
205+
}
206+
return res;
207+
}
208+
209+
private void swap(int i, int j, int x, int y) {
210+
int t = board[i][j];
211+
board[i][j] = board[x][y];
212+
board[x][y] = t;
213+
}
214+
}
215+
```
216+
217+
### **C++**
218+
219+
```cpp
220+
class Solution {
221+
public:
222+
int slidingPuzzle(vector<vector<int>>& board) {
223+
string start = gets(board);
224+
string end = "123450";
225+
if (start == end) return 0;
226+
unordered_set<string> vis;
227+
vis.insert(start);
228+
queue<string> q{{start}};
229+
int ans = 0;
230+
while (!q.empty())
231+
{
232+
++ans;
233+
for (int n = q.size(); n > 0; --n)
234+
{
235+
string x = q.front();
236+
q.pop();
237+
setb(x, board);
238+
for (string y : next(board))
239+
{
240+
if (y == end) return ans;
241+
if (!vis.count(y))
242+
{
243+
vis.insert(y);
244+
q.push(y);
245+
}
246+
}
247+
}
248+
}
249+
return -1;
250+
}
251+
252+
string gets(vector<vector<int>>& board) {
253+
string s = "";
254+
for (int i = 0; i < 2; ++i)
255+
for (int j = 0; j < 3; ++j)
256+
s.push_back('0' + board[i][j]);
257+
return s;
258+
}
259+
260+
void setb(string s, vector<vector<int>>& board) {
261+
for (int i = 0; i < 2; ++i)
262+
for (int j = 0; j < 3; ++j)
263+
board[i][j] = s[i * 3 + j] - '0';
264+
}
265+
266+
vector<string> next(vector<vector<int>>& board) {
267+
vector<string> res;
268+
auto p = find0(board);
269+
int i = p.first, j = p.second;
270+
vector<int> dirs = {-1, 0, 1, 0, -1};
271+
for (int k = 0; k < 4; ++k)
272+
{
273+
int x = i + dirs[k], y = j + dirs[k + 1];
274+
if (x >= 0 && x < 2 && y >= 0 && y < 3)
275+
{
276+
swap(i, j, x, y, board);
277+
res.push_back(gets(board));
278+
swap(i, j, x, y, board);
279+
}
280+
}
281+
return res;
282+
}
283+
284+
void swap(int i, int j, int x, int y, vector<vector<int>>& board) {
285+
int t = board[i][j];
286+
board[i][j] = board[x][y];
287+
board[x][y] = t;
288+
}
76289

290+
pair<int, int> find0(vector<vector<int>>& board) {
291+
for (int i = 0; i < 2; ++i)
292+
for (int j = 0; j < 3; ++j)
293+
if (board[i][j] == 0)
294+
return {i, j};
295+
return {0, 0};
296+
}
297+
};
77298
```
78299
79300
### **...**

0 commit comments

Comments
 (0)