สมมติว่าเรามีอาร์เรย์ 2 มิติ โดยที่แต่ละเซลล์ประกอบด้วยค่าตัวเลขซึ่งแสดงถึงค่าใช้จ่ายในการเข้าชมผ่านเซลล์นั้น เราต้องหาเส้นทางจากเซลล์ด้านซ้ายบนไปยังเซลล์ด้านขวาล่างโดยที่ค่าใช้จ่ายทั้งหมดที่ใช้ไปนั้นน้อยที่สุด
ดังนั้นหากอินพุตเป็นแบบ
32 | 10 1 | 66 | 13 | 19 |
11 | 14 | 48 | 15 8 | 7 |
10 1 | 11 14 | 17 5 | 12 | 34 |
89 | 12 5 | 42 | 21 | 14 1 |
10 0 | 33 | 11 2 | 42 | 21 |
แล้วผลลัพธ์จะเป็น 340 เป็น (32 + 11 + 14 + 48 + 66 + 13 + 19 + 7 + 34 + 12 + 21 + 42 + 21) =340
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
- กำหนดเซลล์ด้วยค่าพิกัด x, y และระยะทาง
- กำหนดเมทริกซ์อาร์เรย์ที่มีขนาด:row x col.
- เติมเมทริกซ์ด้วย inf
- กำหนดขนาดอาร์เรย์ dx:4 :={ - 1, 0, 1, 0}
- กำหนดขนาดอาร์เรย์:4 :={0, 1, 0, - 1}
- กำหนดเซลล์หนึ่งชุดที่เรียกว่า st
- แทรกเซลล์(0, 0, 0) ลงใน st
- เมทริกซ์[0, 0] :=grid[0, 0]
- ในขณะที่ (ไม่ใช่ st ว่างเปล่า) ให้ทำ −
- k :=องค์ประกอบแรกของ st
- ลบองค์ประกอบแรกของ st ออกจาก st
- สำหรับการเริ่มต้น i :=0, เมื่อ i <4, อัปเดต (เพิ่ม i ขึ้น 1), ทำ −
- x :=k.x + dx[i]
- y :=k.y + dy[i]
- ถ้าไม่ใช่ isOk(x, y) แล้ว −
- ไม่ต้องสนใจตอนต่อไป ข้ามไปที่ตอนต่อไป
- ถ้า matrix[x, y]> matrix[k.x, k.y] + grid[x, y] แล้ว −
- ถ้าเมทริกซ์[x, y] ไม่เท่ากับ inf แล้ว −
- ค้นหาและลบเซลล์(x, y, matrix[x, y]) จาก st
- เมทริกซ์[x, y] :=เมทริกซ์[k.x, k.y] + กริด[x, y]
- แทรกเซลล์(x, y, เมทริกซ์[x, y]) ลงใน st
- ถ้าเมทริกซ์[x, y] ไม่เท่ากับ inf แล้ว −
- return matrix[แถว - 1, col - 1]
ตัวอย่าง
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
#includeใช้เนมสเปซ std;#define ROW 5#define COL 5class เซลล์ { สาธารณะ:int x, y; ระยะทางภายใน; เซลล์ (int x, int y, ระยะทาง int) :x (x), y (y), ระยะทาง (ระยะทาง) {}};ตัวดำเนินการบูล <(เซลล์ const &a, เซลล์ const &b) { if (a.distance ==b.distance) { ถ้า (a.x !=b.x) ส่งคืน (a.x =0 &&i =0 &&j st; st.insert(เซลล์(0, 0, 0)); เมทริกซ์[0][0] =ตาราง[0][0]; ในขณะที่ (!st.empty()) { เซลล์ k =*st.begin(); st.erase(st.begin()); สำหรับ (int i =0; i <4; i++) { int x =k.x + dx[i]; int y =k.y + dy[i]; ถ้า (!isOk(x, y)) ดำเนินการต่อ; if (เมทริกซ์[x][y]> matrix[k.x][k.y] + ตาราง[x][y]){ if (เมทริกซ์[x][y] !=INT_MAX) st.erase(st.find(cell( x, y, เมทริกซ์[x][y])))); เมทริกซ์[x][y] =เมทริกซ์[k.x][k.y] + ตาราง[x][y]; st.insert(เซลล์(x, y, เมทริกซ์[x][y])); } } } return matrix[row - 1][col - 1];}int main() { int grid[ROW][COL] ={ 32, 101, 66, 13, 19, 11, 14, 48, 158, 7, 101, 114, 175, 12, 34, 89, 126, 42, 21, 141, 100, 33, 112, 42, 21 }; ศาล <<แก้ (ตาราง ROW, COL);}
อินพุต
<ก่อน>{32, 101, 66, 13, 19,11, 14, 48, 158, 7,101, 114, 175, 12, 34,89, 126, 42, 21, 141,100, 33, 112, 42, 21};ผลลัพธ์:
340