假设我们有一个 h x w 的网格。网格在一个名为 'initGrid' 的二维数组中表示,其中网格中的每个单元格都用 '#' 或 '.' 表示。 '#' 表示网格中有障碍物,'.' 表示该单元格上有一条路径。现在,一个机器人被放置在网格上的一个单元格 'c' 上,该单元格具有行号 x 和列号 y。机器人必须从一个具有行号 p 和列号 q 的单元格 'd' 移动到另一个单元格。单元格坐标 c 和 d 都以整数对的形式给出。现在,机器人可以按以下方式从一个单元格移动到另一个单元格:
-
如果机器人想要移动到的单元格位于当前单元格的垂直或水平相邻位置,机器人可以直接从一个单元格走到另一个单元格。
-
机器人可以跳到以其当前位置为中心的 5x5 区域中的任何单元格。
-
机器人只能移动到不包含障碍物的网格中的另一个单元格。机器人也不能离开网格。
我们需要找出机器人到达目标所需的跳数。
因此,如果输入为 h = 4,w = 4,c = {2, 1},d = {4, 4},initGrid = {"#...", ".##.", "...#", "..#."},那么输出将为 1。机器人只需要一次跳跃就可以到达目的地。
为了解决这个问题,我们将按照以下步骤进行:
N:= 100
Define intger pairs s and t.
Define an array grid of size: N.
Define an array dst of size: N x N.
Define a struct node that contains integer values a, b, and e.
Define a function check(), this will take a, b,
return a >= 0 AND a = 0 AND b dst[a value of nd, b value of nd], then:
Ignore the following part, skip to the next iteration
for initialize diffx := -2, when diffx 1, then 1, otherwise 0)
if dst[a value of nd, b value of nd] + w 登录后复制
Example
让我们看下面的实现以获得更好的理解−
#include
using namespace std;
const int INF = 1e9;
#define N 100
int 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])
continue;
for (int diffx = -2; diffx 1) ? 1 : 0;
if (dst[nd.a][nd.b] + w c, pair 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[] = {"#...", ".##.", "...#", "..#."};
solve(c, d, initGrid);
return 0;
}
登录后复制
输入
4, 4, {2, 1}, {4, 4}, {"#...", ".##.", "...#", "..#."}
登录后复制
输出
1
登录后复制
以上就是C++程序用于找出机器人在网格中到达特定单元所需的跳跃次数的详细内容,更多请关注每日运维网(www.mryunwei.com)其它相关文章!