สมมติว่าเราต้องการสร้างบ้านบนที่ดินเปล่าซึ่งเข้าถึงอาคารทั้งหมดได้ในระยะทางที่สั้นที่สุด เราขยับได้เพียงสี่ทิศทางเท่านั้น เช่น ขึ้น ลง ซ้ายและขวา เรามีตาราง 2 มิติของค่า 0, 1 หรือ 2 โดยที่ −
-
0 หมายถึง ดินแดนที่ว่างเปล่าซึ่งเราสามารถผ่านไปได้โดยเสรี
-
1 หมายถึงสิ่งปลูกสร้างที่เราไม่สามารถผ่านได้
-
2 หมายถึง อุปสรรคที่เราไม่สามารถผ่านได้
ดังนั้นหากอินพุตเป็นแบบ
1 | 0 | 2 | 0 | 1 |
0 | 0 | 0 | 0 | 0 |
0 | 0 | 1 | 0 | 0 |
แล้วเอาท์พุตจะเป็น 7 เนื่องจากให้อาคารสามหลังอยู่ที่ (0,0), (0,4), (2,2) และมีสิ่งกีดขวางอยู่ที่ (0,2) ดังนั้นจุด (1,2) จึงเป็น ที่ดินเปล่าเหมาะสร้างบ้าน ระยะทางรวม 3+3+1=7 เป็นอย่างต่ำ
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
ret :=inf
-
n :=ขนาดแถวของกริด
-
m :=ขนาด col ของกริด
-
numberOfOnes :=0
-
กำหนดขนาดอาร์เรย์ 2 มิติหนึ่งขนาด n x m
-
กำหนดขอบเขตอาร์เรย์ 2 มิติหนึ่งขนาด n x m
-
สำหรับการเริ่มต้น i :=0 เมื่อ i
-
สำหรับการเริ่มต้น j :=0 เมื่อ j
-
ถ้า grid[i, j] เหมือนกับ 1 แล้ว −
-
(เพิ่มจำนวนคนขึ้น 1)
-
กำหนดหนึ่งคิว q
-
แทรก {i, j} ลงใน q
-
กำหนดการเยี่ยมชมหนึ่งชุด
-
สำหรับการเริ่มต้น lvl :=1 เมื่อไม่มี q ว่าง ให้อัปเดต (เพิ่ม lvl ขึ้น 1) ทำ -
-
sz :=ขนาดของ q
-
ในขณะที่ sz ไม่ใช่ศูนย์ ให้ลด sz ในการวนซ้ำแต่ละครั้ง ทำ -
-
curr :=องค์ประกอบแรกของ q
-
ลบองค์ประกอบออกจาก q
-
x :=curr.first
-
y :=curr.วินาที
-
สำหรับการเริ่มต้น k :=0 เมื่อ k <4 อัปเดต (เพิ่ม k ขึ้น 1) ทำ -
-
nx :=x + dir[k, 0]
-
ny :=y + dir[k, 1]
-
ถ้า nx และ ny อยู่ในช่วงของกริด orgrid[nx,ny] ไม่ใช่ 0 ดังนั้น
-
ไม่ต้องสนใจตอนต่อไป ข้ามไปตอนต่อไป
-
แทรก {nx, ny} เข้าไปแล้ว
-
dist[nx, ny] :=dist[nx, ny] + เลเวล
-
(เพิ่มการเข้าถึง[nx, ny] 1)
-
แทรก {nx, ny} ลงใน q
-
-
-
-
-
-
-
สำหรับการเริ่มต้น i :=0 เมื่อ i
-
สำหรับการเริ่มต้น j :=0 เมื่อ j
-
ถ้า grid[i, j] เท่ากับ 0 และ reach[i, j] เหมือนกับ numberOfOnes แล้ว −
-
ret :=ขั้นต่ำของ ret และ dist[i, j]
-
-
-
-
return (ถ้า ret เหมือนกับ inf แล้ว -1 มิฉะนั้น ret)
ตัวอย่าง
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
int dir[4][2] = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}}; class Solution { public: int shortestDistance(vector<vector<int>>& grid) { int ret = INT_MAX; int n = grid.size(); int m = grid[0].size(); int numberOfOnes = 0; vector < vector <int> > dist(n, vector <int>(m)); vector < vector <int> > reach(n, vector <int>(m)); for(int i = 0; i < n; i++){ for(int j = 0; j < m; j++){ if(grid[i][j] == 1){ numberOfOnes++; queue < pair <int, int> > q; q.push({i, j}); set < pair <int, int> > visited; for(int lvl = 1; !q.empty(); lvl++){ int sz = q.size(); while(sz--){ pair <int, int> curr = q.front(); q.pop(); int x = curr.first; int y = curr.second; 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 >= n || ny >= m || visited.count({nx, ny}) || grid[nx][ny] != 0) continue; visited.insert({nx, ny}); dist[nx][ny] += lvl; reach[nx][ny]++; q.push({nx, ny}); } } } } } } for(int i = 0; i < n; i++){ for(int j = 0; j < m; j++){ if(grid[i][j] == 0 && reach[i][j] == numberOfOnes){ ret = min(ret, dist[i][j]); } } } return ret == INT_MAX ? -1 : ret; } };
อินพุต
[[1,0,2,0,1],[0,0,0,0,0],[0,0,1,0,0]]
ผลลัพธ์
7