假设我有以下形状(字符串类型);
..ee
e..e
以下空格:
||..
.|..
我的方法shapeFitsAt()
确定给定的形状是否可以放置在指示的行/列位置。 row,col
表示左上角的位置
将放置形状的角[块(0,0)
]。一个形状会
如果其中一个填充的块与一个冲突,则不适合
空间中现有的填充块或将超出范围
空间。 “|”表示块“/障碍”而“。”意味着一个空的空间。
因此,如果我将上述形状放入空间,它将如下所示:
||ee
e|.e
请smb帮助如何将形状贴合到空间中?提前谢谢!
public class CreateSpace {
private int height;
private int width;
private char[][] space = new char[height][width];
private Shape originalShape;
public CreateSpace(int height, int width, char[][] space, Shape shape)
{
this.height = height;
this.width = width;
this.space = space;
this.originalShape = shape;
}
public boolean shapeFitsAt(int row, int col, Shape shape)
{
if(row < 0 || row >= height || col < 0 || col >= width)
throw new FitItException("Oops! Out of bounds in CreateSpace class! Go and check!");
else if(space[row][col] == '|' || space[row][col] == this.originalShape.getDisplayChar())
throw new FitItException("The space position is already filled out with a wall or a character. GO CHECK CreateSpace class!");
else
{
}
}
答案 0 :(得分:1)
解决方案是将模式“线性化”为2个位组(一个用于形状,一个用于障碍物)。
将1放在必须保留形状位集的位置,将0放在其他位置;把0放在障碍物的位置,把1放在“障碍物”位置的其他地方。
前:
..ee --> ..eee..e --> 00111001
e..e
||.. --> ||...|.. --> 00111011
.|..
然后AND两个位集,看看结果是否与形状位集相同。 如果是,那么形状合适;如果没有,至少有一个障碍阻碍了。
Shape : 00111001
Obstacles : 00111011
AND : 00111001 == Shape bitset => OK !
快速高效,您可以重复使用障碍物位集来测试多种形状模式。