matlab符合推箱子规则 给点三个箱子的坐标(12,3)(3,12)(12,12)和一个目标点坐标(3,3),人坐标(9,10),人去推动箱子到目标点,人先将箱子推到同一列或者同一行后再沿那一列或者那一行推箱子到目标点
时间: 2024-03-11 13:47:33 浏览: 46
以下是一个 Matlab 代码实现:
```matlab
% 每个箱子的坐标
box1 = [12, 3];
box2 = [3, 12];
box3 = [12, 12];
% 目标点坐标
target = [3, 3];
% 人的初始位置
person = [9, 10];
% 计算每个箱子距离目标点和人的距离
dist1 = norm(box1 - target) + norm(box1 - person);
dist2 = norm(box2 - target) + norm(box2 - person);
dist3 = norm(box3 - target) + norm(box3 - person);
% 找到距离目标点和人最近的箱子
[min_dist, min_idx] = min([dist1, dist2, dist3]);
% 将最近的箱子移动到目标点(如果可以)
if min_idx == 1
% 移动箱子1
if abs(box1(1) - person(1)) == 1 && box1(2) == person(2)
% 人在箱子1的左边或右边,可以推动箱子1
box1(1) = person(1);
elseif abs(box1(2) - person(2)) == 1 && box1(1) == person(1)
% 人在箱子1的上面或下面,可以推动箱子1
box1(2) = person(2);
end
% 沿着同一行或同一列移动箱子1到目标点
if box1(1) == target(1)
% 箱子1在目标点的同一列,向上或向下推
if box1(2) < target(2)
% 箱子1在目标点的上面,向下推
box1(2:end) = box1(2:end) + 1;
else
% 箱子1在目标点的下面,向上推
box1(2:end) = box1(2:end) - 1;
end
else
% 箱子1在目标点的同一行,向左或向右推
if box1(1) < target(1)
% 箱子1在目标点的左边,向右推
box1 = box1 + [1, 0];
else
% 箱子1在目标点的右边,向左推
box1 = box1 - [1, 0];
end
end
elseif min_idx == 2
% 移动箱子2
if abs(box2(1) - person(1)) == 1 && box2(2) == person(2)
% 人在箱子2的左边或右边,可以推动箱子2
box2(1) = person(1);
elseif abs(box2(2) - person(2)) == 1 && box2(1) == person(1)
% 人在箱子2的上面或下面,可以推动箱子2
box2(2) = person(2);
end
% 沿着同一行或同一列移动箱子2到目标点
if box2(1) == target(1)
% 箱子2在目标点的同一列,向上或向下推
if box2(2) < target(2)
% 箱子2在目标点的上面,向下推
box2(2:end) = box2(2:end) + 1;
else
% 箱子2在目标点的下面,向上推
box2(2:end) = box2(2:end) - 1;
end
else
% 箱子2在目标点的同一行,向左或向右推
if box2(1) < target(1)
% 箱子2在目标点的左边,向右推
box2 = box2 + [1, 0];
else
% 箱子2在目标点的右边,向左推
box2 = box2 - [1, 0];
end
end
else
% 移动箱子3
if abs(box3(1) - person(1)) == 1 && box3(2) == person(2)
% 人在箱子3的左边或右边,可以推动箱子3
box3(1) = person(1);
elseif abs(box3(2) - person(2)) == 1 && box3(1) == person(1)
% 人在箱子3的上面或下面,可以推动箱子3
box3(2) = person(2);
end
% 沿着同一行或同一列移动箱子3到目标点
if box3(1) == target(1)
% 箱子3在目标点的同一列,向上或向下推
if box3(2) < target(2)
% 箱子3在目标点的上面,向下推
box3(2:end) = box3(2:end) + 1;
else
% 箱子3在目标点的下面,向上推
box3(2:end) = box3(2:end) - 1;
end
else
% 箱子3在目标点的同一行,向左或向右推
if box3(1) < target(1)
% 箱子3在目标点的左边,向右推
box3 = box3 + [1, 0];
else
% 箱子3在目标点的右边,向左推
box3 = box3 - [1, 0];
end
end
end
```
这个代码会计算每个箱子距离目标点和人的距离,然后找到距离最近的箱子,并检查人是否可以推动这个箱子到目标点。如果可以,它会先将箱子推到目标点所在的同一行或同一列,然后沿着这一行或这一列推箱子到目标点。注意,这个代码只移动一个箱子,但你可以根据需要修改代码来移动多个箱子。
阅读全文