สมมติว่ามีเขาวงกตที่มีที่ว่างและกำแพง และยังมีลูกบอลอยู่ในเขาวงกตนั้นด้วย ลูกบอลสามารถผ่านช่องว่างได้โดยการหมุนขึ้น (u) ลง (d) ไปทางซ้าย (l) หรือขวา (r) แต่มันจะกลิ้งไปเรื่อย ๆ จนกว่าจะชนกำแพง เมื่อบอลหยุดก็สามารถเลือกทิศทางต่อไปได้ หลุมหนึ่งอยู่ในเขาวงกตนั้นด้วย ลูกบอลจะตกลงไปในหลุมถ้ากลิ้งไปที่หลุม
ดังนั้นถ้าเรามีตำแหน่งลูก ตำแหน่งหลุม และเขาวงกต เราต้องค้นหาว่าลูกบอลจะตกลงไปในหลุมได้อย่างไร โดยการย้ายระยะทางที่สั้นที่สุด ที่นี่ระยะทางถูกกำหนดโดยจำนวนช่องว่างที่ลูกบอลเดินทางตั้งแต่ต้น (ไม่รวม) ถึงหลุม (รวมอยู่ด้วย)
กลับทิศทางการเคลื่อนที่โดยใช้ 'u', 'd', 'l' และ 'r' เนื่องจากอาจมีวิธีที่สั้นที่สุดได้หลายวิธี และผลลัพธ์ควรเป็นวิธีที่เล็กที่สุด ถ้าลูกไปไม่ถึงหลุม แสดงว่า "เป็นไปไม่ได้"
ที่นี่เขาวงกตแสดงด้วยเมทริกซ์ไบนารี 1 หมายถึง กําแพง และ 0 หมายถึง ที่ว่าง. พิกัดลูกและหลุมจะแสดงด้วยดัชนีแถวและคอลัมน์
ดังนั้นหากอินพุตเป็นแบบ
จากนั้นผลลัพธ์จะเป็น 'lul' เมื่อเลื่อนไปทางซ้าย จากนั้นขึ้นแล้วซ้าย ผลลัพธ์อื่นอาจเป็น 'ul' ขึ้นแล้วซ้าย ทั้งสองมีความยาว 6 แต่นั่นไม่ได้เล็กกว่า lul ทางพจนานุกรม
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
กำหนดประเภทข้อมูลที่เรียกว่า Data ซึ่งจะใช้ระยะทาง สตริง d และพิกัด x,y
-
กำหนดขนาดอาร์เรย์ของขนาด:4 x 2 :={{1, 0}, {0, - 1}, {0, 1}, { - 1, 0}}
-
กำหนดขนาดอาร์เรย์ของขนาด:4 :={'d', 'l', 'r', 'u'}
-
กำหนดฟังก์ชัน ok() ซึ่งจะใช้เวลา x1, y1, x2, y2,
-
คืนค่า จริง หาก x1 เหมือนกับ x2 และ y1 เหมือนกับ y2
-
จากวิธีหลัก ให้ทำดังต่อไปนี้ −
-
n :=ขนาดแถวของเขาวงกต
-
m :=(ถ้า n ไม่ใช่ศูนย์ แสดงว่าขนาด col ของเขาวงกต มิฉะนั้น 0)
-
กำหนดลำดับความสำคัญหนึ่งคิว pq
-
แทรกข้อมูลใหม่ด้วย (0, ball[0], ball[1], "") ลงใน pq
-
กำหนดอาร์เรย์ 2 มิติที่เข้าชมขนาด n x m
-
ในขณะที่ (ไม่ใช่ pq ว่างเปล่า) ทำ -
-
curr :=องค์ประกอบด้านบนของ pq
-
x :=curr.x
-
y :=curr.y
-
dist :=curr.dist
-
d :=curr.d
-
ถ้า ok(x, y, hole[0], hole[1]), แล้ว −
-
ผลตอบแทน d
-
-
เยี่ยมชม[x, y] :=จริง
-
ลบองค์ประกอบออกจาก pq
-
สำหรับการเริ่มต้น k :=0 เมื่อ k − 4 อัปเดต (เพิ่ม k ขึ้น 1) ทำ −
-
nx :=x, ny :=y
-
tempDist :=0
-
ขณะที่ nx + dir[k, 0]
=0 และ ny + dir[k, 1] =0 และเขาวงกต[nx + dir[k, 0], ny + dir[k, 1]] คือ 0, ทำ − -
nx :=nx + dir[k, 0]
-
ny :=ny + dir[k, 1]
-
(เพิ่ม tempDist ขึ้น 1)
-
ถ้า ok(nx, ny, hole[0], hole[1]) แล้ว −
-
ออกจากวง
-
-
-
หากเข้าชม[nx, ny] เป็นศูนย์ ดังนั้น −
-
แทรกข้อมูลใหม่ (dist + tempDist, nx, ny, d + dirst[k]) ลงใน pq
-
-
-
กลับ "เป็นไปไม่ได้"
-
ตัวอย่าง
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
#include <bits/stdc++.h> using namespace std; int dir[4][2] = {{1, 0}, {0, -1}, {0, 1}, {-1, 0}}; char dirst[4] = {'d', 'l', 'r', 'u'}; class Solution { public: struct Data { int dist; string d; int x, y; Data(int a, int b, int c, string s) { d = s; dist = a; x = b; y = c; } }; struct Comparator { bool operator()(Data a, Data b) { return a.dist != b.dist ? !(a.dist < b.dist) : !(a.d < b.d); } }; bool ok(int x1, int y1, int x2, int y2) { return x1 == x2 && y1 == y2; } string findShortestWay(vector<vector<int>> &maze, vector<int>&ball, vector<int> &hole) { int n = maze.size(); int m = n ? maze[0].size() : 0; priority_queue<vector<Data>, vector<Data>, Comparator> pq; pq.push(Data(0, ball[0], ball[1], "")); vector<vector<bool>> visited(n, vector<bool>(m)); while (!pq.empty()) { Data curr = pq.top(); int x = curr.x; int y = curr.y; int dist = curr.dist; string d = curr.d; if (ok(x, y, hole[0], hole[1])) { return d; } visited[x][y] = true; pq.pop(); for (int k = 0; k < 4; k++) { int nx = x; int ny = y; int tempDist = 0; while (nx + dir[k][0] < n && nx + dir[k][0] >= 0 && ny + dir[k][1] < m && ny + dir[k][1] >= 0 && !maze[nx + dir[k][0]][ny + dir[k][1]]) { nx += dir[k][0]; ny += dir[k][1]; tempDist++; if (ok(nx, ny, hole[0], hole[1])) break; } if (!visited[nx][ny]) { pq.push(Data(dist + tempDist, nx, ny, d + dirst[k])); } } } return "impossible"; } }; main() { Solution ob; vector<vector<int>> v = { {0, 0, 0, 0, 0}, {1, 1, 0, 0, 1}, {0, 0, 0, 0, 0}, {0, 1, 0, 0, 1}, {0, 1, 0, 0, 0}}; vector<int> v1 = {4, 3}, v2 = {0, 1}; cout << (ob.findShortestWay(v, v1, v2)); }
อินพุต
vector<vector<int>> v = {{0, 0, 0, 0, 0}, {1, 1, 0, 0, 1}, {0, 0, 0, 0, 0}, {0, 1, 0, 0, 1}, {0, 1, 0, 0, 0}}; vector<int> v1 = {4, 3}, v2 = {0, 1};
ผลลัพธ์
lul