สมมติว่าเรามีหนึ่งตาราง N x N แต่ละตารางสี่เหลี่ยม [i][j] แสดงถึงระดับความสูงที่จุดนั้น (i,j) ตอนนี้ถือว่าฝนเริ่มตกแล้ว ณ เวลา t ความลึกของน้ำทุกที่คือ t เราสามารถว่ายน้ำจากสี่เหลี่ยมหนึ่งไปยังอีกสี่เหลี่ยมที่อยู่ติดกัน 4 ทิศทางได้ เมื่อความสูงของสี่เหลี่ยมทั้งสองแยกกันอยู่ที่ t มากที่สุด เราสามารถว่ายเป็นระยะทางอนันต์ในเวลาเป็นศูนย์
เราควรเริ่มจากตำแหน่ง (0, 0) เราต้องหาเวลาให้น้อยที่สุดจนกว่าจะถึงสี่เหลี่ยมด้านล่างขวา (N-1, N-1)
ดังนั้นหากอินพุตเป็นแบบ
0 | 1 | 2 | 3 | 4 |
24 | 23 | 22 | 21 | 5 |
12 | 13 | 15 | 15 | 16 |
11 | 17 | 18 | 19 | 20 |
10 | 9 | 8 | 7 | 6 |
วิธีที่ถูกต้องคือลงสี ดังนั้นคำตอบจะเป็น 16
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
- กำหนดข้อมูล จะใช้พารามิเตอร์สามตัว เช่น เวลา x และ y
- กำหนดขนาดอาร์เรย์ของอาร์เรย์:4 x 2 :={ { 1, 0 }, { - 1, 0 }, { 0, 1 }, { 0, - 1 } } }
- n :=แถวของตาราง m :=คอลัมน์ของตาราง
- กำหนดลำดับความสำคัญของคิว q
- กำหนดอาร์เรย์ 2 มิติที่เข้าชมขนาด n x m หนึ่งรายการ เติมค่านี้ด้วย 0
- เข้าชมแล้ว[0, 0] :=1
- แทรก Data(grid[0, 0], 0, 0) ลงใน q
- ในขณะที่ (ไม่ใช่ q ว่างเปล่า) ทำ −
- โหนด =องค์ประกอบด้านบนของ q และลบองค์ประกอบออกจาก q
- เวลา :=เวลาของโหนด
- x :=x ของโหนด y :=y ของโหนด
- ถ้า x เหมือนกับ n - 1 และ y เหมือนกับ m - 1 แล้ว −
- เวลากลับ
- สำหรับการเริ่มต้น i :=0, เมื่อ i <4, อัปเดต (เพิ่ม i ขึ้น 1), ทำ −
- nx :=dir[i, 0] + x, ny :=dir[i, 1] + y
- ถ้า nx>=0 และ nx
=0 และ ny - เข้าชมแล้ว[nx, y] :=1
- แทรกข้อมูล (สูงสุดของกริด[nx, ny] และเวลา, nx, ny) ลงใน q
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
ตัวอย่าง
#includeใช้เนมสเปซ std;จัดโครงสร้างข้อมูล{ เวลา int, x, y; ข้อมูล (int a, int b, int y){ เวลา =a; x =ข; นี่->y =y; }};ตัวเปรียบเทียบโครงสร้าง{ ตัวดำเนินการบูล ()(ข้อมูล a, ข้อมูล b){ return !(a.time >&grid) { int n =grid.size(); int m =กริด[0].size(); Priority_queue <ข้อมูล, เวกเตอร์ <ข้อมูล>, ตัวเปรียบเทียบ> q; เวกเตอร์ <เวกเตอร์ > เข้าชมแล้ว (n, เวกเตอร์ (m, 0)); เยี่ยมชม[0][0] =1; q.push(ข้อมูล(กริด[0][0], 0, 0)); ในขณะที่(!q.empty()){ โหนดข้อมูล =q.top(); q.ป๊อป(); int เวลา =node.time; int x =node.x; int y =node.y; if(x ==n - 1 &&y ==m - 1)return time; สำหรับ(int i =0; i <4; i++){ int nx =dir[i][0] + x; int ny =dir[i][1] + y; if(nx>=0 &&nx =0 &&ny > v ={{0,1,2,3,4},{24,23,22,21,5},{12,13,15,15,15,16},{11,17 ,18,19,20}, {10,9,8,7,6}}; ศาล <<(ob.swimInWater(v));}
อินพุต
<ก่อน>{{0,1,2,3,4},{24,23,22,21,5},{12,13,15,15,16},{11,17,18,19,20 },{10,9,8,7,6}}ผลลัพธ์
16