Computer >> Máy Tính >  >> Lập trình >> C ++

Chương trình C ++ để tìm ra số bước nhảy cần thiết để rô bốt tiếp cận một ô cụ thể trong lưới

Giả sử, chúng ta có một lưới kích thước h x w. Lưới được biểu diễn trong một mảng 2D được gọi là ‘initGrid’, trong đó mỗi ô trong lưới được biểu diễn bằng dấu '#' hoặc '.'. '#' có nghĩa là lưới chứa chướng ngại vật và '.' có nghĩa là có một đường dẫn qua ô đó. Bây giờ, một robot được đặt trên ô 'c' trên lưới có số hàng x và số cột y. Robot phải di chuyển đến một ô khác 'd' có số hàng p và số cột q. Cả tọa độ ô c và d đều được hiển thị dưới dạng các cặp số nguyên. Giờ đây, rô bốt có thể di chuyển từ ô này sang ô khác theo những cách sau -

  • Robot chỉ có thể đi từ ô này sang ô khác nếu ô mà nó muốn di chuyển đến nằm theo chiều dọc hoặc chiều ngang liền kề với ô mà nó đang ở.

  • Robot có thể nhảy đến bất kỳ ô nào trong khu vực 5 × 5 có tâm tại ô mà nó hiện đang đặt.

  • Robot chỉ có thể di chuyển đến một ô khác trong lưới nếu ô đích không chứa chướng ngại vật. Robot cũng không thể rời khỏi lưới.

Chúng tôi phải tìm ra số lần nhảy mà nó sẽ cần để đến đích.

Vì vậy, nếu đầu vào giống như h =4, w =4, c ={2, 1}, d ={4, 4}, initGrid ={"# ...", ". ##.", ". .. # "," .. #. "}, thì đầu ra sẽ là 1. Robot sẽ chỉ cần một bước nhảy để đến đích.

Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -

 N:=100 Xác định cặp intger s và t. Xác định lưới mảng có kích thước:N. Xác định dst mảng có kích thước:N x N. Xác định nút cấu trúc chứa các giá trị nguyên a, b và e. Xác định a function check (), điều này sẽ nhận a, b, trả về a> =0 AND a  =0 AND b  dst [a value of nd, b value of nd], then:Bỏ qua phần sau, bỏ qua bước lặp tiếp theo để khởi tạo diffx:=-2, khi diffx <=2, hãy cập nhật (tăng diffx lên 1 ), do:để khởi tạo diffy:=-2, khi diffy <=2, cập nhật (tăng diffy lên 1), do:tm:=| diffx + | diffy || nx:=một giá trị của nd + diffx, ny =b giá trị của nd + diffy nếu kiểm tra (nx, ny) và lưới [nx, ny] giống như '.', thì:w:=(nếu tm> 1, thì 1, ngược lại là 0) if dst [a value of nd, b value of nd] + w  

Ví dụ

Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -

 #include  using namespace 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]}); while (! doubleq.empty ()) {node nd =doubleq.front (); doubleq.pop_front (); if (nd.e> dst [nd.a] [nd.b]) tiếp tục; for (int diffx =-2; diffx <=2; diffx ++) {for (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; if (dst [nd.a] [nd.b] + w  c, cặp  d, string initGrid []) {s =c; t =d; s.first--, s.second--, t.first--, t.second--; for (int i =0; i  c ={2, 1}, d ={4, 4}; string initGrid [] ={"# ...", ". ##.", "... #", ".. #."}; giải quyết (c, d, initGrid); trả về 0;} 

Đầu vào

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

Đầu ra

 1