diff --git a/kurisu/src/B137.java b/kurisu/src/B137.java new file mode 100644 index 0000000000000000000000000000000000000000..e942992cc15714b955f6949e0e0cadd4e933ac10 --- /dev/null +++ b/kurisu/src/B137.java @@ -0,0 +1,130 @@ +import java.util.ArrayList; +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(); + ArrayList> areaSizes = new ArrayList>(); + for (int i = 0; i < vertical; i++) { + ArrayList blockData = new ArrayList(); + for (int j = 0; j < horizontal; j++) { + blockData.add(sc.next()); + } + areaSizes.add(blockData); + } + + sc.close(); + + ErasingBlock block = new ErasingBlock(vertical, horizontal, areaSizes); + block.eraseAdjacentBlocks(); + block.fallBlock(); + ArrayList> blockStates = block.getBlockStates(); + + BlockResult result = new BlockResult(); + System.out.println(result.output(blockStates)); + } +} + + +class ErasingBlock { + private ArrayList> blockSizes = new ArrayList>(); + private ArrayList> blockSwitches = new ArrayList>(); + private int vertical; + private int horizontal; + + ErasingBlock(int vertical, int horizontal, ArrayList> blockSizes) { + this.vertical = vertical; + this.horizontal = horizontal; + this.blockSizes = blockSizes; + setBlockSwitches(); + } + + // blockSwitchの初期化 + private void setBlockSwitches() { + for (int i = 0; i < vertical; i++) { + ArrayList blockSwitch = new ArrayList<>(); + for (int j = 0; j < horizontal; j++) { + blockSwitch.add(false); + } + blockSwitches.add(blockSwitch); + } + } + + public ArrayList> getBlockStates() { + return blockSizes; + } + + public ArrayList> getBlockSwitches() { + return blockSwitches; + } + + // 同じブロックの色がつながっているならそのブロック全てを#に置き換える + public void eraseAdjacentBlocks() { + for (int i = 0; i < vertical; i++) { + for (int j = 0; j < horizontal; j++) { + String adjacentBlock = blockSizes.get(i).get(j); + + if (j + 1 < horizontal) { + if (adjacentBlock.equals(blockSizes.get(i).get(j + 1))) { + blockSwitches.get(i).set(j, true); + blockSwitches.get(i).set(j + 1, true); + } + } + if (i + 1 < vertical) { + if (adjacentBlock.equals(blockSizes.get(i + 1).get(j))) { + blockSwitches.get(i).set(j, true); + blockSwitches.get(i + 1).set(j, true); + } + } + } + } + for (int i = 0; i < vertical; i++) { + for (int j = 0; j < horizontal; j++) { + if (blockSwitches.get(i).get(j)) { + blockSizes.get(i).set(j, "#"); + } + } + } + } + + // 残ったブロックを落下させて地面に置く + public void fallBlock() { + for (int j = 0; j < horizontal; j++) { + ArrayList columnBlock = new ArrayList<>(); + ArrayList columnEmpty = new ArrayList<>(); + for (int i = vertical - 1; i >= 0; i--) { + String block = blockSizes.get(i).get(j); + if (!block.equals("#")) { + columnBlock.add(block); + } else { + columnEmpty.add("#"); + } + } + columnBlock.addAll(columnEmpty); + + for (int i = 0; i < vertical; i++) { + blockSizes.get(i).set(j, columnBlock.get((vertical - 1) - i)); + } + } + } +} + + +class BlockResult { + public String output(ArrayList> blockStates) { + String allBlocksString = ""; + for (int i = 0; i < blockStates.size(); i++) { + ArrayList row = blockStates.get(i); + String rowString = String.join(" ", row); + allBlocksString += rowString; + if(i < 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..d5ddb7ed032466a5ca452a2d47ece76a3f94230e --- /dev/null +++ b/kurisu/src/B137Test.java @@ -0,0 +1,98 @@ +import static org.junit.Assert.*; +import java.util.ArrayList; +import java.util.Arrays; +import org.junit.Test; + +public class B137Test { + final int vertical = 3; + final int horizontal = 3; + + + public ArrayList> template(){ + ArrayList> 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() { + ArrayList> 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の初期化ができているか + ArrayList> blockSwitches = block.getBlockSwitches(); + assertEquals(vertical, blockSwitches.size()); + assertEquals(horizontal,blockSwitches.get(0).size()); + for(ArrayList row : blockSwitches) { + for(Boolean sut : row) { + assertEquals(false, sut); + } + } + } + + @Test + public void testEraseAdjacentBlocks() { + ArrayList> areaSizes = template(); + + ErasingBlock block = new ErasingBlock(vertical, horizontal, areaSizes); + block.eraseAdjacentBlocks(); + ArrayList> 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() { + ArrayList> areaSizes = template(); + ErasingBlock block = new ErasingBlock(vertical, horizontal, areaSizes); + block.eraseAdjacentBlocks(); + block.fallBlock(); + ArrayList> 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(){ + ArrayList> areaSizes = template(); + ErasingBlock block = new ErasingBlock(vertical, horizontal, areaSizes); + block.eraseAdjacentBlocks(); + block.fallBlock(); + ArrayList> blockStates = block.getBlockStates(); + + BlockResult result = new BlockResult(); + String expected = "# # #" + System.lineSeparator() + + "# # g" + System.lineSeparator() + + "# b b"; + assertEquals(expected, result.output(blockStates)); + } +}