Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

ว่ายน้ำในน้ำที่เพิ่มขึ้นใน C++


สมมติว่าเรามีหนึ่งตาราง 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
  • คืน -1
  • ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -

    ตัวอย่าง

    #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