如何计算Java中瓷砖地板所需的瓷砖数量

时间:2014-10-14 22:40:42

标签: java

我刚刚开始编程并遇到了这个问题。

如何计算瓷砖地板所需的瓷砖数量? 瓷砖是宽度为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的帮助

2 个答案:

答案 0 :(得分:1)

获得这样的东西怎么样?

enter image description here

基本上,假设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;
}