สมมติว่าเรามีกระดาน 2x3 หนึ่งกระดาน มี 5 แผ่นที่แสดงด้วยตัวเลขตั้งแต่ 1 ถึง 5 และมีช่องว่างหนึ่งช่องที่มี 0 แทน
ในที่นี้การย้ายหมายถึง 0 และหนึ่งหมายเลขที่อยู่ติดกัน (บน ล่าง ซ้ายหรือขวา) และสลับกัน สิ่งนี้จะได้รับการแก้ไขเมื่อองค์ประกอบถูกจัดเรียงในลักษณะนี้:[[1,2,3],[4,5,0]].
เรามีกระดานปริศนา เราต้องหาจำนวนการเคลื่อนไหวให้น้อยที่สุดเพื่อให้สถานะของกระดานได้รับการแก้ไข หากไม่สามารถแก้ไขได้ ให้คืนค่า -1
ดังนั้น หากอินพุตเป็น [[1,2,3],[0,4,5]] เอาต์พุตจะเป็น 2 เนื่องจากเราต้องสลับ [0,4] ตามด้วย [0,5]
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
กำหนดฟังก์ชันหนึ่งตัว slidingPuzzle() ซึ่งจะใช้บอร์ดเป็นอินพุต
-
ถ้ากระดานถูกจัดเรียงอย่างสมบูรณ์แล้ว −
-
คืนค่า 0
-
-
กำหนดหนึ่งคิว q ของเมทริกซ์ 2d
-
ใส่บอร์ดลงใน q
-
กำหนดหนึ่งชุดที่เข้าชมสำหรับเมทริกซ์ 2 มิติ
-
ใส่บอร์ดเข้าไป
-
สำหรับการเริ่มต้น lvl :=1 เมื่อไม่มี q ว่าง ให้อัปเดต (เพิ่ม lvl ขึ้น 1) ทำ -
-
sz :=ขนาดของ q
-
ในขณะที่ sz ไม่ใช่ศูนย์ ให้ลด sz หลังจากการวนซ้ำแต่ละครั้ง ให้ทำ -
-
กำหนดโหนดอาร์เรย์ 2 มิติหนึ่งโหนด =องค์ประกอบด้านหน้าของ q
-
ลบองค์ประกอบออกจาก q
-
dx :=-1, y :=-1
-
สำหรับการเริ่มต้น i :=0 เมื่อ i <ขนาดของบอร์ด ให้อัปเดต (เพิ่ม i ขึ้น 1) ให้ทำ −
-
สำหรับการเริ่มต้น j :=0 เมื่อ j
-
ถ้าโหนด[i, j] เหมือนกับ 0 แล้ว −
-
x :=ผม
-
y :=เจ
-
ออกจากวง
-
-
-
-
สำหรับการเริ่มต้น k :=0 เมื่อ k <4 อัปเดต (เพิ่ม k ขึ้น 1) ทำ -
-
ถ้า nx <0 หรือ ny <0 หรือ nx>=จำนวนแถวของบอร์ดหรือ ny>=จำนวนคอลัมน์ของบอร์ด −
-
ละเว้นส่วนต่อไปนี้ ข้ามไปยังการทำซ้ำถัดไป
-
-
โหนดแลกเปลี่ยน[x, y] และโหนด[nx, ny]
-
ถ้าโหนดถูกเยี่ยมชม −
-
โหนดแลกเปลี่ยน[x, y] และโหนด[nx, ny]
-
ละเว้นส่วนต่อไปนี้ ข้ามไปยังการทำซ้ำถัดไป
-
-
แทรกโหนดเข้าเยี่ยมชม
-
ถ้าโหนดเป็นตัวจัดเรียงบอร์ดที่สมบูรณ์แบบ −
-
กลับเลเวล
-
-
แทรกโหนดลงใน q
-
โหนดแลกเปลี่ยน[x, y] และโหนด[nx, ny]
-
-
-
กลับ -1
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
ตัวอย่าง
#include <bits/stdc++.h>
using namespace std;
int dir[4][2] = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};
class Solution {
public:
bool ok(vector < vector <int> >& b){
return b[0][0] == 1 && b[0][1] == 2 && b[0][2] == 3 && b[1]
[0] == 4 && b[1][1] == 5;
}
int slidingPuzzle(vector<vector<int>>& board) {
if (ok(board))
return 0;
queue<vector<vector<int> > > q;
q.push(board);
set<vector<vector<int> > > visited;
visited.insert(board);
for (int lvl = 1; !q.empty(); lvl++) {
int sz = q.size();
while (sz--) {
vector<vector<int> > node = q.front();
q.pop();
int x = -1;
int y = -1;
for (int i = 0; i < board.size(); i++) {
for (int j = 0; j < board[0].size(); j++) {
if (node[i][j] == 0) {
x = i;
y = j;
break;
}
}
}
for (int k = 0; k < 4; k++) {
int nx = x + dir[k][0];
int ny = y + dir[k][1];
if (nx < 0 || ny < 0 || nx >= board.size() || ny
>= board[0].size())
continue;
swap(node[x][y], node[nx][ny]);
if (visited.count(node)) {
swap(node[x][y], node[nx][ny]);
continue;
}
visited.insert(node);
if (ok(node))
return lvl;
q.push(node);
swap(node[x][y], node[nx][ny]);
}
}
}
return -1;
}
};
main(){
Solution ob;
vector<vector<int>> v = {{1,2,3},{0,4,5}};
cout << (ob.slidingPuzzle(v));
} อินพุต
{{1,2,3},{0,4,5}} ผลลัพธ์
2