diff --git a/kurisu/src/B137.java b/kurisu/src/B137.java new file mode 100644 index 0000000000000000000000000000000000000000..7109b3ef76293b031f139fedf25e09a295bdf2a8 --- /dev/null +++ b/kurisu/src/B137.java @@ -0,0 +1,127 @@ +import java.util.ArrayList; +import java.util.List; +import java.util.Scanner; + +public class B137 { + public static void main(String[] args) { + Scanner sc = new Scanner(System.in); + final int vertical = sc.nextInt(); + final int horizontal = sc.nextInt(); + // paizaの問題を解く場合には必要になるが、実行時には影響なし + // final int colorType = sc.nextInt(); + List> areaSizes = new ArrayList<>(); + + for (int row = 0; row < vertical; row++) { + List blockData = new ArrayList(); + for (int column = 0; column < horizontal; column++) { + blockData.add(sc.next()); + } + areaSizes.add(blockData); + } + + sc.close(); + + ErasingBlock block = new ErasingBlock(vertical, horizontal, areaSizes); + block.eraseAdjacentBlocks(); + block.fallBlock(); + List> blockStates = block.getBlockStates(); + + BlockResult result = new BlockResult(); + System.out.println(result.output(blockStates)); + } +} + + +class ErasingBlock { + private List> blockSizes = new ArrayList<>(); + private List> blockSwitches = new ArrayList<>(); + private int vertical; + private int horizontal; + + ErasingBlock(int vertical, int horizontal, List> blockSizes) { + this.vertical = vertical; + this.horizontal = horizontal; + this.blockSizes = blockSizes; + setBlockSwitches(); + } + + // blockSwitchの初期化 + private void setBlockSwitches() { + for (int row = 0; row < vertical; row++) { + List blockSwitch = new ArrayList<>(); + for (int column = 0; column < horizontal; column++) { + blockSwitch.add(false); + } + blockSwitches.add(blockSwitch); + } + } + + public List> getBlockStates() { + return blockSizes; + } + + public List> getBlockSwitches() { + return blockSwitches; + } + + // 同じブロックの色がつながっているならそのブロック全てを#に置き換える + public void eraseAdjacentBlocks() { + for (int row = 0; row < vertical; row++) { + for (int column = 0; column < horizontal; column++) { + String adjacentBlock = blockSizes.get(row).get(column); + if (column + 1 < horizontal && adjacentBlock.equals(blockSizes.get(row).get(column + 1))) { + blockSwitches.get(row).set(column, true); + blockSwitches.get(row).set(column + 1, true); + } + if (row + 1 < vertical && adjacentBlock.equals(blockSizes.get(row + 1).get(column))) { + blockSwitches.get(row).set(column, true); + blockSwitches.get(row + 1).set(column, true); + } + } + } + for (int row = 0; row < vertical; row++) { + for (int column = 0; column < horizontal; column++) { + if (blockSwitches.get(row).get(column)) { + blockSizes.get(row).set(column, "#"); + } + } + } + } + + // 残ったブロックを落下させて地面に置く + public void fallBlock() { + for (int column = 0; column < horizontal; column++) { + List columnBlock = new ArrayList<>(); + List columnEmpty = new ArrayList<>(); + for (int row = vertical - 1; row >= 0; row--) { + String block = blockSizes.get(row).get(column); + if (!block.equals("#")) { + columnBlock.add(block); + } else { + columnEmpty.add("#"); + } + } + columnBlock.addAll(columnEmpty); + + for (int row = 0; row < vertical; row++) { + blockSizes.get(row).set(column, columnBlock.get((vertical - 1) - row)); + } + } + } +} + + +class BlockResult { + public String output(List> blockStates) { + String allBlocksString = ""; + for (int row = 0; row < blockStates.size(); row++) { + List rowBlocks = blockStates.get(row); + String rowString = String.join(" ", rowBlocks); + allBlocksString += rowString; + if (row < blockStates.size() - 1) { + allBlocksString += System.lineSeparator(); + } + } + return allBlocksString; + } +} diff --git a/kurisu/src/B137Test.java b/kurisu/src/B137Test.java new file mode 100644 index 0000000000000000000000000000000000000000..a65a93bab22c0f283eca6d0ff611a3e08eff8056 --- /dev/null +++ b/kurisu/src/B137Test.java @@ -0,0 +1,99 @@ +import static org.junit.Assert.*; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import org.junit.Test; + +public class B137Test { + final int vertical = 3; + final int horizontal = 3; + + public List> template(){ + List> areaSizes = new ArrayList<>(); + + areaSizes.add(new ArrayList(Arrays.asList("g","b","g"))); + areaSizes.add(new ArrayList(Arrays.asList("g","r","b"))); + areaSizes.add(new ArrayList(Arrays.asList("g","r","r"))); + + return areaSizes; + } + + @Test + public void testErasingBlock() { + List> areaSizes = template(); + + ErasingBlock block = new ErasingBlock(vertical, horizontal, areaSizes); + assertEquals(vertical, areaSizes.size()); + assertEquals(horizontal, areaSizes.get(0).size()); + assertEquals("g", areaSizes.get(0).get(0)); + assertEquals("b", areaSizes.get(0).get(1)); + assertEquals("g", areaSizes.get(0).get(2)); + assertEquals("g", areaSizes.get(1).get(0)); + assertEquals("r", areaSizes.get(1).get(1)); + assertEquals("b", areaSizes.get(1).get(2)); + assertEquals("g", areaSizes.get(2).get(0)); + assertEquals("r", areaSizes.get(2).get(1)); + assertEquals("r", areaSizes.get(2).get(2)); + + //blockSwitchesの初期化ができているか + List> blockSwitches = block.getBlockSwitches(); + assertEquals(vertical, blockSwitches.size()); + assertEquals(horizontal,blockSwitches.get(0).size()); + for(List row : blockSwitches) { + for(Boolean sut : row) { + assertEquals(false, sut); + } + } + } + + @Test + public void testEraseAdjacentBlocks() { + List> areaSizes = template(); + + ErasingBlock block = new ErasingBlock(vertical, horizontal, areaSizes); + block.eraseAdjacentBlocks(); + List> adjacentBlocks = block.getBlockStates(); + assertEquals("#", adjacentBlocks.get(0).get(0)); + assertEquals("b", adjacentBlocks.get(0).get(1)); + assertEquals("g", adjacentBlocks.get(0).get(2)); + assertEquals("#", adjacentBlocks.get(1).get(0)); + assertEquals("#", adjacentBlocks.get(1).get(1)); + assertEquals("b", adjacentBlocks.get(1).get(2)); + assertEquals("#", adjacentBlocks.get(2).get(0)); + assertEquals("#", adjacentBlocks.get(2).get(1)); + assertEquals("#", adjacentBlocks.get(2).get(2)); + } + + @Test + public void testFallBlocks() { + List> areaSizes = template(); + ErasingBlock block = new ErasingBlock(vertical, horizontal, areaSizes); + block.eraseAdjacentBlocks(); + block.fallBlock(); + List> adjacentBlocks = block.getBlockStates(); + assertEquals("#", adjacentBlocks.get(0).get(0)); + assertEquals("#", adjacentBlocks.get(0).get(1)); + assertEquals("#", adjacentBlocks.get(0).get(2)); + assertEquals("#", adjacentBlocks.get(1).get(0)); + assertEquals("#", adjacentBlocks.get(1).get(1)); + assertEquals("g", adjacentBlocks.get(1).get(2)); + assertEquals("#", adjacentBlocks.get(2).get(0)); + assertEquals("b", adjacentBlocks.get(2).get(1)); + assertEquals("b", adjacentBlocks.get(2).get(2)); + } + + @Test + public void testOutput(){ + List> areaSizes = template(); + ErasingBlock block = new ErasingBlock(vertical, horizontal, areaSizes); + block.eraseAdjacentBlocks(); + block.fallBlock(); + List> blockStates = block.getBlockStates(); + + BlockResult result = new BlockResult(); + String expected = "# # #" + System.lineSeparator() + + "# # g" + System.lineSeparator() + + "# b b"; + assertEquals(expected, result.output(blockStates)); + } +}