我刚刚开始编程并遇到了这个问题。
如何计算瓷砖地板所需的瓷砖数量? 瓷砖是宽度为20的正方形,地板长度和宽度由用户输入。
我可以通过使用%来计算我需要多少完整的瓷砖,但是一旦我到达侧面的瓷砖碎片,我就会卡住。允许切割较小的条带,你不能制作马赛克。
我已经尝试将这些尺寸存储在一个列表中并将它们尽可能地添加到20个。但是后来我遇到的问题就像使用2块8块瓷砖并使用2块瓷砖2块12,而2个瓷砖就足够了。
我似乎无法找到一种方法来编写逻辑。
final int tile = 20;
double length = Input.readDouble();
double width = Input.readDouble();
int completeColumTiles = (int)width/tile;
int completeRowTiles = (int)length/tile;
int tilesWithoutRest = completeRowTiles * completeColumTiles;
double restLength = length%tile;
double restWidth = width%tile;
int tilesRest = calculateRest(completeColumTiles, completeRowTiles, restLength, restWidth);
int tilesWithRest = tilesWithoutRest + tilesRest;
System.out.println("You need " + tilesWithRest + " tiles.");
所以基本上我需要有关calculateRest的帮助
答案 0 :(得分:1)
获得这样的东西怎么样?
基本上,假设private static final int TILE_DIMENSION = 20;
,您需要:
private int getTilesCount(final int floorWidth, final int floorHeight) {
final int horizontalTiles = (floorWidth % TILE_DIMENSION) + ((floorWidth / TILE_DIMENSION) == 0) ? 1 : 0;
final int verticalTiles = (floorHeight % TILE_DIMENSION) + ((floorHeight / TILE_DIMENSION) == 0) ? 1 : 0;
return horizontalTiles * verticalTiles;
}
我在这个方法中做的事情可以简单地分解如下:
horizontalTiles
),verticalTiles
)和以下是我如何计算每行/每列中的图块数量:
计算单行/列中可容纳的切片数量:
floorWidth / TILE_DIMENSION
如果该行/列中还留有一些空白空间,请再添加1个图块:
+ ((floorWidth / TILE_DIMENSION) == 0) ? 1 : 0;
作为旁注,如果您还不知道,我在此处使用的语法((evalutaion) ? expression1 : expression2 ;
)称为Ternary Operator。
它完全对应于(伪代码):
variable result;
if (evaluation) {
result = expression1;
} else {
result = expression2;
}
答案 1 :(得分:0)
也许这是有效的:首先计算未切割的块,然后是具有最大间隙的一侧,最后是具有较小间隙的一侧,尝试重用第一面的剩余块。
int countTiles() {
int wholeTilesX = roomWidh / 20;
int wholeTilesY = roomHeight / 20;
int remainingGapX = roomWidh % 20;
int remainingGapY = roomHeight % 20;
int neededExtraTiles;
if(remainingGapX > remainingGapY) {
neededExtraTiles = countTilesNeededForSides(
wholeTilesX, remainingGapX, wholeTilesY, remainingGapY);
} else {
neededExtraTiles = countTilesNeededForSides(
wholeTilesY, remainingGapY, wholeTilesX, remainingGapX);
}
int neededTiles = wholeTilesX*wholeTilesY+neededExtraTiles;
return neededTiles;
}
// Assuming side A has a larger gap.
private int countTilesNeededForSides(
int wholeTilesSideA, int gapSideA,
int wholeTilesSideB, int gapSideB) {
int gapPiecesB = wholeTilesSideB * 20/gapSideA;
int leftoversFittingA = wholeTilesSideB * ((20%gapSideA) / gapSideB);
// +1 is for the corner
int neededBitsSideA = (wholeTilesSideA+1) - leftoversFittingA;
int gapPiecesA = neededBitsSideA > 0 ? neededBitsSideA * 20/gapSideA : 0;
return gapPiecesA+gapPiecesB;
}