我必须创建10X10板和5艘船,每艘船的长度为2,3,3,4,5。船舶不应该相互重叠,它们应该在网格内(10x10),它们应该只是垂直或水平。
我已经做了差不多两天了,到目前为止我唯一能做的就是在10x10板上制作4个横向和重叠的船长2,3,4,5。
所以我坚持的部分如下: 1)我使船只在网格内,但它们是重叠的。 2)我可以制作4艘船,每个长度为2,3,4,5但不能做3次出现两次。 3)我只能做水平布置而不是垂直布置。我希望这艘船是垂直的或水平的。
所以我写的代码如下:
{
matrix = zeros(10,10);
row = randi(size(matrix, 1),1,1); %row number
col = randi(size(matrix, 2),1,1); %column number
for i=2:5
while col(1,1)+i-1>10 % Checking if it is within grid
row = randi(size(matrix, 1),1,1); %row number
col = randi(size(matrix, 2),1,1); %column number
end
matrix(row,col:col+i-1)=i;
row = randi(size(matrix, 1),1,1); %row number
col = randi(size(matrix, 2),1,1); %column number
end
matrix
}
我无法想出任何解决方案。我非常感谢你的帮助。
答案 0 :(得分:2)
如果我没有弄错的话,你在使用这种方法时遇到了麻烦,而不是编码本身。
我建议你为每艘船使用一个标志(船舶ID),并在10x10矩阵中给定船舶占用的每个地点输入该ID(所有其他地点为0)。
现在放船:
从10x10矩阵的自由点中随机选择一个点(x,y坐标)。让该坐标代表我们试图放置的船的一端。现在只能以4种可能的方式放置船只(从这个选定坐标开始向上/向下/向左/向右4个方向)。 对于4种可能方式中的每种方法,检查(取决于船的长度)是否:
a)船舶适合并且不会超出10x10矩阵
b)船舶与占用地点不重叠如果两个方向中的一个或多个都满足,则随机选择一个并放置船。否则,在虚拟的10x10矩阵中,将此未占用的点标记为不能用于放置当前船只的点,并随机选择另一个未占用的点(这仍然是合理的,即在我们的虚拟矩阵内没有标记为不可能)。