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

โปรแกรม C++ เพื่อค้นหาจำนวนการกระโดดที่จำเป็นสำหรับหุ่นยนต์เพื่อไปยังเซลล์ใดเซลล์หนึ่งในตาราง


สมมุติว่าเรามีตารางขนาด hxw ตารางจะแสดงในอาร์เรย์ 2 มิติที่เรียกว่า 'initGrid' โดยที่แต่ละเซลล์ในกริดจะแสดงด้วย '#' หรือ '.' '#' หมายความว่ากริดมีสิ่งกีดขวางและ '.' หมายความว่ามีเส้นทางผ่านเซลล์นั้น ตอนนี้ หุ่นยนต์ถูกวางบนเซลล์ 'c' บนตารางที่มีหมายเลขแถว x และหมายเลขคอลัมน์ y หุ่นยนต์ต้องเดินทางไปยังเซลล์อื่นที่มีหมายเลขแถว p และคอลัมน์หมายเลข q ทั้งพิกัดเซลล์ c และ d จะแสดงให้เราเป็นคู่จำนวนเต็ม ตอนนี้ หุ่นยนต์สามารถเคลื่อนที่จากเซลล์หนึ่งไปยังอีกเซลล์หนึ่งได้ด้วยวิธีต่อไปนี้ −

  • หุ่นยนต์สามารถเดินจากเซลล์หนึ่งไปยังอีกเซลล์หนึ่งได้ หากเซลล์ที่ต้องการย้ายไปนั้นตั้งอยู่ติดกับเซลล์ที่อยู่ในแนวตั้งหรือแนวนอน

  • หุ่นยนต์สามารถกระโดดไปยังเซลล์ใดก็ได้ในพื้นที่ 5×5 ซึ่งมีจุดศูนย์กลางอยู่ที่เซลล์ที่มันตั้งอยู่

  • หุ่นยนต์สามารถย้ายไปยังเซลล์อื่นในตารางได้ก็ต่อเมื่อเซลล์ปลายทางไม่มีสิ่งกีดขวาง หุ่นยนต์ไม่สามารถออกจากกริดได้

เราต้องหาจำนวนการกระโดดเพื่อไปให้ถึงที่หมาย

ดังนั้น หากอินพุตเป็น h =4, w =4, c ={2, 1}, d ={4, 4}, initGrid ={"#...", ".##.", ". ..#", "..#."} จากนั้นผลลัพธ์จะเป็น 1 หุ่นยนต์จะต้องกระโดดเพียงครั้งเดียวเพื่อไปยังจุดหมายปลายทาง

เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -

N:=100 กำหนดคู่ของจำนวนเต็ม s และ t.กำหนดตารางอาร์เรย์ที่มีขนาด:N.กำหนดขนาดอาร์เรย์ dst:N x N.กำหนดโหนดโครงสร้างที่มีค่าจำนวนเต็ม a, b และ e.กำหนด a function check() ซึ่งจะใช้เวลา a, b, คืนค่า a>=0 และ a =0 AND b  dst[a ค่า nd, b ค่า nd] จากนั้น:ละเว้นส่วนต่อไปนี้ ข้ามไปที่การวนซ้ำถัดไปเพื่อเริ่มต้น diffx :=-2 เมื่อ diffx <=2 อัปเดต (เพิ่ม diffx ขึ้น 1 ) ทำ:สำหรับการเริ่มต้น diffy :=-2 เมื่อ diffy <=2 อัปเดต (เพิ่ม diffy 1) ทำ:tm :=|diffx + |diffy|| nx :=ค่าของ nd + diffx, ny =b ค่าของ nd + diffy ถ้า check(nx, ny) และ grid[nx, ny] เหมือนกับ '.' ดังนั้น:w :=(ถ้า tm> 1, แล้ว 1 มิฉะนั้น 0) ถ้า dst[a ค่าของ nd, b ค่าของ nd] + w  

ตัวอย่าง

ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -

#include using เนมสเปซ std;const int INF =1e9;#define N 100int h, w;pair s, t;string grid[N];int dst[N ][N];struct node { int a, b, e;};bool check(int a, int b) { return a>=0 &&a =0 &&b  doubleq; doubleq.push_back({a, b, dst[a][b]}); ในขณะที่ (!doubleq.empty()) { โหนด nd =doubleq.front(); doubleq.pop_front(); ถ้า (nd.e> dst[nd.a][nd.b]) ดำเนินการต่อ; สำหรับ (int diffx =-2; diffx <=2; diffx ++) { สำหรับ (int diffy =-2; diffy <=2; diffy ++) { int tm =abs (diffx) + abs (diffy); int nx =nd.a + diffx, ny =nd.b + diffy; if (check(nx, ny) &&grid[nx][ny] =='.') { int w =(tm> 1) ? 1 :0; ถ้า (dst[nd.a][nd.b] + w  c, คู่ d, สตริง initGrid[]){ s =c; เสื้อ =d; s.first--, s.second--, t.first--, t.วินาที--; for(int i =0; i  c ={2, 1}, d ={4, 4}; สตริง initGrid[] ={"#...", ".##.", "...#", "..#."}; แก้ (c, d, initGrid); คืนค่า 0;}

อินพุต

4, 4, {2, 1}, {4, 4}, {"#...", ".##.", "...#", "..#."} 

ผลลัพธ์

1