From bed6d2f4f0db3217f14186d12b85032e337e3649 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BC=8A=E8=97=A4=20=E8=81=96=E5=A4=9C?= Date: Fri, 2 Aug 2024 17:28:38 +0900 Subject: [PATCH 1/5] =?UTF-8?q?paiza=E3=81=AEA083=E3=81=AE=E5=9B=9E?= =?UTF-8?q?=E7=AD=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sitou/src/A083_SecretMessage.java | 154 ++++++++++++++++++++++++++++++ sitou/src/Adventurer.java | 15 +++ sitou/src/InputData.java | 16 ++++ sitou/src/Parallel.java | 21 ++++ sitou/src/Result.java | 13 +++ sitou/src/TreasureMap.java | 26 +++++ sitou/test/A083_Test.java | 37 +++++++ sitou/test/TreasureMapTest.java | 73 ++++++++++++++ 8 files changed, 355 insertions(+) create mode 100644 sitou/src/A083_SecretMessage.java create mode 100644 sitou/src/Adventurer.java create mode 100644 sitou/src/InputData.java create mode 100644 sitou/src/Parallel.java create mode 100644 sitou/src/Result.java create mode 100644 sitou/src/TreasureMap.java create mode 100644 sitou/test/A083_Test.java create mode 100644 sitou/test/TreasureMapTest.java diff --git a/sitou/src/A083_SecretMessage.java b/sitou/src/A083_SecretMessage.java new file mode 100644 index 0000000..5eb1009 --- /dev/null +++ b/sitou/src/A083_SecretMessage.java @@ -0,0 +1,154 @@ +package src; + +import java.util.ArrayDeque; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Queue; +import java.util.Scanner; + +public class A083_SecretMessage { + + public static void main(String[] args) { + execute(); + } + + static void execute() { + final InputData inputData = input(); + final TreasureMap treasureMap = new TreasureMap(inputData); + final Result result = solve(treasureMap); + output(result); + } + + private static InputData input() { + final Scanner scan = new Scanner(System.in); + final int height = scan.nextInt(); + final int width = scan.nextInt(); + final List mapStatus = new ArrayList(); + + for (int i = 0; i < height; i++) { + mapStatus.add(scan.next()); + } + + scan.close(); + return new InputData(height, width, mapStatus); + + } + + public static Result solve(TreasureMap treasureMap) { + + String result = treasureMap.world.get(0).get(0); + final List resultList = new ArrayList(); + + // 初期値格納 + final Parallel first_time = new Parallel(0, 0, treasureMap.world, result); + final Queue queue = new ArrayDeque<>(); + queue.add(first_time); + + while (true) { + // キューからデータを受け取る + final Parallel parallel = queue.poll(); + + final int nowX = parallel.point.x; + final int nowY = parallel.point.y; + result = parallel.p_result; + + // 世界はディープコピーする + List> now_world = new ArrayList>(); + for (int i = 0; i < treasureMap.height; i++) { + List list = (List) ((ArrayList) parallel.world.get(i)).clone(); + now_world.add(list); + } + + // 今いる場所を次に来れないようにする + now_world.get(nowY).set(nowX, "zzz"); + Adventurer ad = new Adventurer(nowX, nowY); + + // 4方向の文字を確認していく + String sinmoji = "zz"; + int nextX = nowX; + int nextY = nowY; + if ((ad.point.x) + 1 < treasureMap.width && sinmoji + .compareTo(now_world.get(ad.point.y).get((ad.point.x) + 1)) >= 0) { + if (sinmoji.compareTo(now_world.get(ad.point.y).get((ad.point.x) + 1)) == 0) { + final String p_result = result + sinmoji; + final Parallel newParallel = new Parallel((ad.point.x) + 1, ad.point.y, now_world, + p_result); + + queue.add(newParallel); + + } else { + sinmoji = now_world.get(ad.point.y).get(ad.point.x + 1); + nextX = (ad.point.x) + 1; + nextY = ad.point.y; + } + } + if ((ad.point.y) + 1 < treasureMap.height && sinmoji + .compareTo(now_world.get((ad.point.y) + 1).get(ad.point.x)) >= 0) { + if (sinmoji.compareTo(now_world.get((ad.point.y) + 1).get(ad.point.x)) == 0) { + final String p_result = result + sinmoji; + final Parallel newParallel = new Parallel(ad.point.x, (ad.point.y) + 1, now_world, + p_result); + queue.add(newParallel); + + } else { + sinmoji = now_world.get((ad.point.y) + 1).get(ad.point.x); + nextX = ad.point.x; + nextY = (ad.point.y) + 1; + } + } + if (ad.point.x > 0 && sinmoji + .compareTo(now_world.get(ad.point.y).get((ad.point.x) - 1)) >= 0) { + if (sinmoji.compareTo(now_world.get(ad.point.y).get((ad.point.x) - 1)) == 0) { + final String p_result = result + sinmoji; + final Parallel newParallel = new Parallel((ad.point.x) - 1, ad.point.y, now_world, + p_result); + + queue.add(newParallel); + + } else { + sinmoji = now_world.get(ad.point.y).get((ad.point.x) - 1); + nextX = (ad.point.x) - 1; + nextY = ad.point.y; + } + } + if (ad.point.y > 0 && sinmoji + .compareTo(now_world.get((ad.point.y) - 1).get(ad.point.x)) >= 0) { + if (sinmoji.compareTo(now_world.get((ad.point.y) - 1).get(ad.point.x)) == 0) { + final String p_result = result + sinmoji; + final Parallel newParallel = new Parallel(ad.point.x, (ad.point.y) - 1, now_world, + p_result); + + queue.add(newParallel); + + } else { + sinmoji = now_world.get((ad.point.y) - 1).get(ad.point.x); + nextX = ad.point.x; + nextY = (ad.point.y) - 1; + } + } + + final String p_result = result + sinmoji; + + if (nextX == (treasureMap.width) - 1 && nextY == (treasureMap.height) - 1) { + resultList.add(p_result); + } else { + final Parallel newParallel = new Parallel(nextX, nextY, now_world, p_result); + queue.add(newParallel); + } + + if (queue.isEmpty()) { + break; + } + } + + Collections.sort(resultList); + final String resultMassage = resultList.get(0); + return new Result(resultMassage); + } + + private static void output(final Result result) { + System.out.println(result.getMessage()); + } + +} diff --git a/sitou/src/Adventurer.java b/sitou/src/Adventurer.java new file mode 100644 index 0000000..633cb80 --- /dev/null +++ b/sitou/src/Adventurer.java @@ -0,0 +1,15 @@ +package src; + +import java.awt.Point; + +public class Adventurer { + + //冒険家の座標クラス + + final Point point = new Point(); + + public Adventurer(final int x, final int y) { + point.setLocation(x, y); + } + +} diff --git a/sitou/src/InputData.java b/sitou/src/InputData.java new file mode 100644 index 0000000..6aa64f6 --- /dev/null +++ b/sitou/src/InputData.java @@ -0,0 +1,16 @@ +package src; + +import java.util.List; + +public class InputData { + final int height; + final int width; + final List mapStatus; + + public InputData(final int height, final int width, final List mapStatus) { + this.height = height; + this.width = width; + this.mapStatus = mapStatus; + } + +} diff --git a/sitou/src/Parallel.java b/sitou/src/Parallel.java new file mode 100644 index 0000000..099210c --- /dev/null +++ b/sitou/src/Parallel.java @@ -0,0 +1,21 @@ +package src; + +import java.awt.Point; +import java.util.ArrayList; +import java.util.List; + +public class Parallel { + + //queue用にデータをまとめるクラス + + final Point point = new Point(); + List> world = new ArrayList>(); + final String p_result; + + public Parallel(int x, int y, List> world, String p_result) { + point.x = x; + point.y = y; + this.world = world; + this.p_result = p_result; + } +} diff --git a/sitou/src/Result.java b/sitou/src/Result.java new file mode 100644 index 0000000..dc4d4d3 --- /dev/null +++ b/sitou/src/Result.java @@ -0,0 +1,13 @@ +package src; + +public class Result { + final String message; + + public Result(final String message) { + this.message = message; + } + + public final String getMessage() { + return message; + } +} diff --git a/sitou/src/TreasureMap.java b/sitou/src/TreasureMap.java new file mode 100644 index 0000000..9d39c13 --- /dev/null +++ b/sitou/src/TreasureMap.java @@ -0,0 +1,26 @@ +package src; + +import java.util.ArrayList; +import java.util.List; + +public class TreasureMap { + final int height; + final int width; + final List> world = new ArrayList>(); + + public TreasureMap(InputData inputData) { + height = inputData.height; + width = inputData.width; + + //scanした文字列を分解して1文字1マスで扱えるようにする + for (int i = 0; i < height; i++) { + final List list = new ArrayList<>(); + final String mapChar = inputData.mapStatus.get(i); + for (int j = 0; j < width; j++) { + list.add(mapChar.substring(j, j + 1)); + } + world.add(list); + } + } + +} diff --git a/sitou/test/A083_Test.java b/sitou/test/A083_Test.java new file mode 100644 index 0000000..5fc6371 --- /dev/null +++ b/sitou/test/A083_Test.java @@ -0,0 +1,37 @@ +package test; + +import static org.hamcrest.CoreMatchers.*; +import static org.junit.Assert.*; +import java.util.Arrays; +import org.junit.Test; +import src.A083_SecretMessage; +import src.InputData; +import src.Result; +import src.TreasureMap; + +public class A083_Test { + @Test + public void 正しく探索できるかテスト1() { + + final InputData inputData = new InputData(3,5,Arrays.asList("hello","paiza","world")); + TreasureMap treasureMap = new TreasureMap(inputData); + final Result result = A083_SecretMessage.solve(treasureMap); + String actual = result.getMessage(); + + final String expected = "heailload"; + + assertThat(actual, is(expected)); + } + + public void 最も辞書順で小さいメッセージを探索できるかテスト() { + + final InputData inputData = new InputData(3,3,Arrays.asList("abc","bcx","cyz")); + TreasureMap treasureMap = new TreasureMap(inputData); + final Result result = A083_SecretMessage.solve(treasureMap); + String actual = result.getMessage(); + + final String expected = "abcbcxz"; + + assertThat(actual, is(expected)); + } +} diff --git a/sitou/test/TreasureMapTest.java b/sitou/test/TreasureMapTest.java new file mode 100644 index 0000000..6c52480 --- /dev/null +++ b/sitou/test/TreasureMapTest.java @@ -0,0 +1,73 @@ +package test; + +import static org.hamcrest.CoreMatchers.*; +import static org.junit.Assert.*; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import org.junit.Test; + +public class TreasureMapTest { + @Test + public void マスごとに正しく分割できるかテスト() { + + final List> actual = new ArrayList>(); + final List mapStatus = Arrays.asList("hello", "paiza", "world"); + for (int i = 0; i < 3; i++) { + final List list = new ArrayList<>(); + final String mapChar = mapStatus.get(i); + for (int j = 0; j < 5; j++) { + list.add(mapChar.substring(j, j + 1)); + } + actual.add(list); + } + + final List> expected = new ArrayList>(Arrays + .asList(Arrays.asList("h", "e", "l", "l", "o"), Arrays.asList("p", "a", "i", "z", "a"), + Arrays.asList("w", "o", "r", "l", "d"))); + + assertThat(actual, is(expected)); + + } + + @Test + public void 秘境の大きさが最小の時に正しく分割できるかテスト() { + final List> actual = new ArrayList>(); + final List mapStatus = Arrays.asList("a"); + for (int i = 0; i < 1; i++) { + final List list = new ArrayList<>(); + final String mapChar = mapStatus.get(i); + for (int j = 0; j < 1; j++) { + list.add(mapChar.substring(j, j + 1)); + } + actual.add(list); + } + + final List> expected = new ArrayList>(Arrays + .asList(Arrays.asList("a"))); + + assertThat(actual, is(expected)); + } + + @Test + public void 秘境の大きさが最大の時に正しく分割できるかテスト() { + final List> actual = new ArrayList>(); + final List mapStatus = Arrays + .asList("abcde", "fghij", "klmno", "pqrst", "uvwxy", "zzzzz"); + for (int i = 0; i < 6; i++) { + final List list = new ArrayList<>(); + final String mapChar = mapStatus.get(i); + for (int j = 0; j < 5; j++) { + list.add(mapChar.substring(j, j + 1)); + } + actual.add(list); + } + + final List> expected = new ArrayList>(Arrays + .asList(Arrays.asList("a", "b", "c", "d", "e"), Arrays.asList("f", "g", "h", "i", "j"), + Arrays.asList("k", "l", "m", "n", "o"), Arrays.asList("p", "q", "r", "s", "t"), Arrays + .asList("u", "v", "w", "x", "y"), Arrays.asList("z", "z", "z", "z", "z"))); + + assertThat(actual, is(expected)); + } +} -- GitLab From 33afccb99f895bd66c781772b6269cf88c4d20f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BC=8A=E8=97=A4=20=E8=81=96=E5=A4=9C?= Date: Tue, 13 Aug 2024 13:27:01 +0900 Subject: [PATCH 2/5] =?UTF-8?q?paiza=E3=81=AEA083=E3=81=AE=E4=BF=AE?= =?UTF-8?q?=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sitou/src/A083_SecretMessage.java | 140 ++++++++---------------------- sitou/src/Adventurer.java | 15 ---- sitou/src/InputData.java | 6 +- sitou/src/Parallel.java | 21 ----- sitou/src/Result.java | 2 +- sitou/src/TreasureMap.java | 32 ++++--- sitou/test/A083_Test.java | 30 +++++-- sitou/test/TreasureMapTest.java | 96 ++++++++++---------- 8 files changed, 131 insertions(+), 211 deletions(-) delete mode 100644 sitou/src/Adventurer.java delete mode 100644 sitou/src/Parallel.java diff --git a/sitou/src/A083_SecretMessage.java b/sitou/src/A083_SecretMessage.java index 5eb1009..afe5e3a 100644 --- a/sitou/src/A083_SecretMessage.java +++ b/sitou/src/A083_SecretMessage.java @@ -1,10 +1,7 @@ package src; -import java.util.ArrayDeque; import java.util.ArrayList; -import java.util.Collections; import java.util.List; -import java.util.Queue; import java.util.Scanner; public class A083_SecretMessage { @@ -24,10 +21,10 @@ public class A083_SecretMessage { final Scanner scan = new Scanner(System.in); final int height = scan.nextInt(); final int width = scan.nextInt(); - final List mapStatus = new ArrayList(); + final String[] mapStatus = new String[height]; for (int i = 0; i < height; i++) { - mapStatus.add(scan.next()); + mapStatus[i] = scan.next(); } scan.close(); @@ -36,115 +33,46 @@ public class A083_SecretMessage { } public static Result solve(TreasureMap treasureMap) { + boolean[][] visited = new boolean[treasureMap.getHeight()][treasureMap.getWidth()]; + List allPaths = new ArrayList<>(); + findPaths(0, 0, "", visited, treasureMap, allPaths); + + //辞書順で早いものを探索 + String smallestPath = allPaths.get(0); + for (String p : allPaths) { + if (p.compareTo(smallestPath) < 0) { + smallestPath = p; + } + } + return new Result(smallestPath); - String result = treasureMap.world.get(0).get(0); - final List resultList = new ArrayList(); - - // 初期値格納 - final Parallel first_time = new Parallel(0, 0, treasureMap.world, result); - final Queue queue = new ArrayDeque<>(); - queue.add(first_time); - - while (true) { - // キューからデータを受け取る - final Parallel parallel = queue.poll(); - - final int nowX = parallel.point.x; - final int nowY = parallel.point.y; - result = parallel.p_result; + } - // 世界はディープコピーする - List> now_world = new ArrayList>(); - for (int i = 0; i < treasureMap.height; i++) { - List list = (List) ((ArrayList) parallel.world.get(i)).clone(); - now_world.add(list); - } + public static void findPaths(int x, int y, String path, boolean[][] visited, + TreasureMap treasureMap, List allPaths) { + //上下左右確認用 + int[] dx = {-1, 1, 0, 0}; + int[] dy = {0, 0, -1, 1}; - // 今いる場所を次に来れないようにする - now_world.get(nowY).set(nowX, "zzz"); - Adventurer ad = new Adventurer(nowX, nowY); - - // 4方向の文字を確認していく - String sinmoji = "zz"; - int nextX = nowX; - int nextY = nowY; - if ((ad.point.x) + 1 < treasureMap.width && sinmoji - .compareTo(now_world.get(ad.point.y).get((ad.point.x) + 1)) >= 0) { - if (sinmoji.compareTo(now_world.get(ad.point.y).get((ad.point.x) + 1)) == 0) { - final String p_result = result + sinmoji; - final Parallel newParallel = new Parallel((ad.point.x) + 1, ad.point.y, now_world, - p_result); - - queue.add(newParallel); - - } else { - sinmoji = now_world.get(ad.point.y).get(ad.point.x + 1); - nextX = (ad.point.x) + 1; - nextY = ad.point.y; - } - } - if ((ad.point.y) + 1 < treasureMap.height && sinmoji - .compareTo(now_world.get((ad.point.y) + 1).get(ad.point.x)) >= 0) { - if (sinmoji.compareTo(now_world.get((ad.point.y) + 1).get(ad.point.x)) == 0) { - final String p_result = result + sinmoji; - final Parallel newParallel = new Parallel(ad.point.x, (ad.point.y) + 1, now_world, - p_result); - queue.add(newParallel); - - } else { - sinmoji = now_world.get((ad.point.y) + 1).get(ad.point.x); - nextX = ad.point.x; - nextY = (ad.point.y) + 1; - } - } - if (ad.point.x > 0 && sinmoji - .compareTo(now_world.get(ad.point.y).get((ad.point.x) - 1)) >= 0) { - if (sinmoji.compareTo(now_world.get(ad.point.y).get((ad.point.x) - 1)) == 0) { - final String p_result = result + sinmoji; - final Parallel newParallel = new Parallel((ad.point.x) - 1, ad.point.y, now_world, - p_result); - - queue.add(newParallel); - - } else { - sinmoji = now_world.get(ad.point.y).get((ad.point.x) - 1); - nextX = (ad.point.x) - 1; - nextY = ad.point.y; - } - } - if (ad.point.y > 0 && sinmoji - .compareTo(now_world.get((ad.point.y) - 1).get(ad.point.x)) >= 0) { - if (sinmoji.compareTo(now_world.get((ad.point.y) - 1).get(ad.point.x)) == 0) { - final String p_result = result + sinmoji; - final Parallel newParallel = new Parallel(ad.point.x, (ad.point.y) - 1, now_world, - p_result); - - queue.add(newParallel); - - } else { - sinmoji = now_world.get((ad.point.y) - 1).get(ad.point.x); - nextX = ad.point.x; - nextY = (ad.point.y) - 1; - } - } + //Map外や二度目に通る所のとき + if (x < 0 || y < 0 || x >= treasureMap.getWorld().length || y >= treasureMap.getWorld()[0].length || visited[x][y]) { + return; + } - final String p_result = result + sinmoji; + //ゴールのとき + if (x == treasureMap.getWorld().length - 1 && y == treasureMap.getWorld()[0].length - 1) { + allPaths.add(path + treasureMap.getWorld()[x][y]); + return; + } - if (nextX == (treasureMap.width) - 1 && nextY == (treasureMap.height) - 1) { - resultList.add(p_result); - } else { - final Parallel newParallel = new Parallel(nextX, nextY, now_world, p_result); - queue.add(newParallel); - } + visited[x][y] = true; + path += treasureMap.getWorld()[x][y]; - if (queue.isEmpty()) { - break; - } + for (int i = 0; i < 4; i++) { + findPaths(x + dx[i], y + dy[i], path, visited, treasureMap, allPaths); } - Collections.sort(resultList); - final String resultMassage = resultList.get(0); - return new Result(resultMassage); + visited[x][y] = false; } private static void output(final Result result) { diff --git a/sitou/src/Adventurer.java b/sitou/src/Adventurer.java deleted file mode 100644 index 633cb80..0000000 --- a/sitou/src/Adventurer.java +++ /dev/null @@ -1,15 +0,0 @@ -package src; - -import java.awt.Point; - -public class Adventurer { - - //冒険家の座標クラス - - final Point point = new Point(); - - public Adventurer(final int x, final int y) { - point.setLocation(x, y); - } - -} diff --git a/sitou/src/InputData.java b/sitou/src/InputData.java index 6aa64f6..fd402e3 100644 --- a/sitou/src/InputData.java +++ b/sitou/src/InputData.java @@ -1,13 +1,11 @@ package src; -import java.util.List; - public class InputData { final int height; final int width; - final List mapStatus; + final String[] mapStatus; - public InputData(final int height, final int width, final List mapStatus) { + public InputData(final int height, final int width, final String[] mapStatus) { this.height = height; this.width = width; this.mapStatus = mapStatus; diff --git a/sitou/src/Parallel.java b/sitou/src/Parallel.java deleted file mode 100644 index 099210c..0000000 --- a/sitou/src/Parallel.java +++ /dev/null @@ -1,21 +0,0 @@ -package src; - -import java.awt.Point; -import java.util.ArrayList; -import java.util.List; - -public class Parallel { - - //queue用にデータをまとめるクラス - - final Point point = new Point(); - List> world = new ArrayList>(); - final String p_result; - - public Parallel(int x, int y, List> world, String p_result) { - point.x = x; - point.y = y; - this.world = world; - this.p_result = p_result; - } -} diff --git a/sitou/src/Result.java b/sitou/src/Result.java index dc4d4d3..8d026fd 100644 --- a/sitou/src/Result.java +++ b/sitou/src/Result.java @@ -3,7 +3,7 @@ package src; public class Result { final String message; - public Result(final String message) { + Result(final String message) { this.message = message; } diff --git a/sitou/src/TreasureMap.java b/sitou/src/TreasureMap.java index 9d39c13..29f9b7c 100644 --- a/sitou/src/TreasureMap.java +++ b/sitou/src/TreasureMap.java @@ -1,26 +1,34 @@ package src; -import java.util.ArrayList; -import java.util.List; - public class TreasureMap { final int height; - final int width; - final List> world = new ArrayList>(); + private final int width; + final char[][] world; public TreasureMap(InputData inputData) { height = inputData.height; width = inputData.width; + world = new char[getHeight()][getWidth()]; + //scanした文字列を分解して1文字1マスで扱えるようにする - for (int i = 0; i < height; i++) { - final List list = new ArrayList<>(); - final String mapChar = inputData.mapStatus.get(i); - for (int j = 0; j < width; j++) { - list.add(mapChar.substring(j, j + 1)); + for(int i = 0; i < getHeight(); i++) { + String text = inputData.mapStatus[i]; + for(int j = 0; j < getWidth(); j++) { + getWorld()[i][j] = text.charAt(j); } - world.add(list); } } - + + public final int getHeight() { + return height; + } + + public int getWidth() { + return width; + } + + public final char[][] getWorld() { + return world; + } } diff --git a/sitou/test/A083_Test.java b/sitou/test/A083_Test.java index 5fc6371..c253510 100644 --- a/sitou/test/A083_Test.java +++ b/sitou/test/A083_Test.java @@ -2,7 +2,6 @@ package test; import static org.hamcrest.CoreMatchers.*; import static org.junit.Assert.*; -import java.util.Arrays; import org.junit.Test; import src.A083_SecretMessage; import src.InputData; @@ -11,9 +10,12 @@ import src.TreasureMap; public class A083_Test { @Test - public void 正しく探索できるかテスト1() { + public void 正しく探索できるかテスト() { - final InputData inputData = new InputData(3,5,Arrays.asList("hello","paiza","world")); + final String[] mapStatus = { + "hello", "paiza", "world" + }; + final InputData inputData = new InputData(3, 5, mapStatus); TreasureMap treasureMap = new TreasureMap(inputData); final Result result = A083_SecretMessage.solve(treasureMap); String actual = result.getMessage(); @@ -23,9 +25,12 @@ public class A083_Test { assertThat(actual, is(expected)); } - public void 最も辞書順で小さいメッセージを探索できるかテスト() { + public void 辞書順で最も小さいメッセージを探索できるかテスト1() { - final InputData inputData = new InputData(3,3,Arrays.asList("abc","bcx","cyz")); + final String[] mapStatus = { + "abc", "bcx", "cyz" + }; + final InputData inputData = new InputData(3, 3, mapStatus); TreasureMap treasureMap = new TreasureMap(inputData); final Result result = A083_SecretMessage.solve(treasureMap); String actual = result.getMessage(); @@ -34,4 +39,19 @@ public class A083_Test { assertThat(actual, is(expected)); } + + public void 辞書順で最も小さいメッセージを探索できるかテスト2() { + + final String[] mapStatus = { + "xabcd", "abcde", "bddea", "cdeab", "deabc", "eabcd" + }; + final InputData inputData = new InputData(6, 5, mapStatus); + TreasureMap treasureMap = new TreasureMap(inputData); + final Result result = A083_SecretMessage.solve(treasureMap); + String actual = result.getMessage(); + + final String expected = "xababcdcddbcdeabababcd"; + + assertThat(actual, is(expected)); + } } diff --git a/sitou/test/TreasureMapTest.java b/sitou/test/TreasureMapTest.java index 6c52480..cbaaedf 100644 --- a/sitou/test/TreasureMapTest.java +++ b/sitou/test/TreasureMapTest.java @@ -1,73 +1,75 @@ package test; -import static org.hamcrest.CoreMatchers.*; import static org.junit.Assert.*; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; import org.junit.Test; +import src.InputData; +import src.TreasureMap; public class TreasureMapTest { @Test public void マスごとに正しく分割できるかテスト() { - final List> actual = new ArrayList>(); - final List mapStatus = Arrays.asList("hello", "paiza", "world"); - for (int i = 0; i < 3; i++) { - final List list = new ArrayList<>(); - final String mapChar = mapStatus.get(i); - for (int j = 0; j < 5; j++) { - list.add(mapChar.substring(j, j + 1)); - } - actual.add(list); - } + final String[] mapStatus = { + "hello", "paiza", "world" + }; + InputData input = new InputData(3, 5, mapStatus); + TreasureMap actual = new TreasureMap(input); - final List> expected = new ArrayList>(Arrays - .asList(Arrays.asList("h", "e", "l", "l", "o"), Arrays.asList("p", "a", "i", "z", "a"), - Arrays.asList("w", "o", "r", "l", "d"))); + final char[][] expected = { + { + 'h', 'e', 'l', 'l', 'o' + }, { + 'p', 'a', 'i', 'z', 'a' + }, { + 'w', 'o', 'r', 'l', 'd' + } + }; - assertThat(actual, is(expected)); + assertArrayEquals(actual.getWorld(), expected); } @Test public void 秘境の大きさが最小の時に正しく分割できるかテスト() { - final List> actual = new ArrayList>(); - final List mapStatus = Arrays.asList("a"); - for (int i = 0; i < 1; i++) { - final List list = new ArrayList<>(); - final String mapChar = mapStatus.get(i); - for (int j = 0; j < 1; j++) { - list.add(mapChar.substring(j, j + 1)); - } - actual.add(list); - } + final String[] mapStatus = { + "a" + }; + InputData input = new InputData(1, 1, mapStatus); + TreasureMap actual = new TreasureMap(input); - final List> expected = new ArrayList>(Arrays - .asList(Arrays.asList("a"))); + final char[][] expected = { + { + 'a' + } + }; - assertThat(actual, is(expected)); + assertArrayEquals(actual.getWorld(), expected); } @Test public void 秘境の大きさが最大の時に正しく分割できるかテスト() { - final List> actual = new ArrayList>(); - final List mapStatus = Arrays - .asList("abcde", "fghij", "klmno", "pqrst", "uvwxy", "zzzzz"); - for (int i = 0; i < 6; i++) { - final List list = new ArrayList<>(); - final String mapChar = mapStatus.get(i); - for (int j = 0; j < 5; j++) { - list.add(mapChar.substring(j, j + 1)); - } - actual.add(list); - } + final String[] mapStatus = { + "abcde", "fghij", "klmno", "pqrst", "uvwxy", "zzzzz" + }; + InputData input = new InputData(6, 5, mapStatus); + TreasureMap actual = new TreasureMap(input); - final List> expected = new ArrayList>(Arrays - .asList(Arrays.asList("a", "b", "c", "d", "e"), Arrays.asList("f", "g", "h", "i", "j"), - Arrays.asList("k", "l", "m", "n", "o"), Arrays.asList("p", "q", "r", "s", "t"), Arrays - .asList("u", "v", "w", "x", "y"), Arrays.asList("z", "z", "z", "z", "z"))); + final char[][] expected = { + { + 'a', 'b', 'c', 'd', 'e' + }, { + 'f', 'g', 'h', 'i', 'j' + }, { + 'k', 'l', 'm', 'n', 'o' + }, { + 'p', 'q', 'r', 's', 't' + }, { + 'u', 'v', 'w', 'x', 'y' + }, { + 'z', 'z', 'z', 'z', 'z' + } + }; - assertThat(actual, is(expected)); + assertArrayEquals(actual.getWorld(), expected); } } -- GitLab From 4701b5c0de0bde508a097dbcb6e39bc065496de0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BC=8A=E8=97=A4=20=E8=81=96=E5=A4=9C?= Date: Tue, 13 Aug 2024 15:43:40 +0900 Subject: [PATCH 3/5] =?UTF-8?q?paiza=E3=81=AEA083=E3=81=AE=E4=BF=AE?= =?UTF-8?q?=E6=AD=A32?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sitou/src/A083_SecretMessage.java | 53 ++++++++++++++++++++++--------- sitou/src/TreasureMap.java | 29 ++++++++++++----- 2 files changed, 59 insertions(+), 23 deletions(-) diff --git a/sitou/src/A083_SecretMessage.java b/sitou/src/A083_SecretMessage.java index afe5e3a..5d93b58 100644 --- a/sitou/src/A083_SecretMessage.java +++ b/sitou/src/A083_SecretMessage.java @@ -33,11 +33,11 @@ public class A083_SecretMessage { } public static Result solve(TreasureMap treasureMap) { - boolean[][] visited = new boolean[treasureMap.getHeight()][treasureMap.getWidth()]; + List allPaths = new ArrayList<>(); - findPaths(0, 0, "", visited, treasureMap, allPaths); + findPaths(0, 0, "", treasureMap, allPaths); - //辞書順で早いものを探索 + // 辞書順で早いものを探索 String smallestPath = allPaths.get(0); for (String p : allPaths) { if (p.compareTo(smallestPath) < 0) { @@ -47,32 +47,55 @@ public class A083_SecretMessage { return new Result(smallestPath); } + + public enum Direction{ + UP(0, -1), + DOWN(0,1), + LEFT(-1,0), + RIGHT(1,0); + + private final int x; + private final int y; + + private Direction(final int x, final int y) { + this.x = x; + this.y = y; + } + + public final int getX() { + return x; + } + + public final int getY() { + return y; + } + } - public static void findPaths(int x, int y, String path, boolean[][] visited, + public static void findPaths(int x, int y, String path, TreasureMap treasureMap, List allPaths) { - //上下左右確認用 - int[] dx = {-1, 1, 0, 0}; - int[] dy = {0, 0, -1, 1}; - //Map外や二度目に通る所のとき - if (x < 0 || y < 0 || x >= treasureMap.getWorld().length || y >= treasureMap.getWorld()[0].length || visited[x][y]) { + // Map外や二度目に通る所のとき + if (x < 0 || y < 0 || x >= treasureMap.getHeight() || y >= treasureMap.getWidth() + || treasureMap.visited[x][y]) { return; } - //ゴールのとき + // ゴールのとき if (x == treasureMap.getWorld().length - 1 && y == treasureMap.getWorld()[0].length - 1) { allPaths.add(path + treasureMap.getWorld()[x][y]); return; } - visited[x][y] = true; - path += treasureMap.getWorld()[x][y]; + treasureMap.mark(x, y); - for (int i = 0; i < 4; i++) { - findPaths(x + dx[i], y + dy[i], path, visited, treasureMap, allPaths); + path += treasureMap.getWorld()[x][y]; + + for(Direction direction : Direction.values()) { + findPaths(x + direction.getX(), y + direction.getY(), path, treasureMap, allPaths); } - visited[x][y] = false; + treasureMap.erase(x, y); + } private static void output(final Result result) { diff --git a/sitou/src/TreasureMap.java b/sitou/src/TreasureMap.java index 29f9b7c..ccf2571 100644 --- a/sitou/src/TreasureMap.java +++ b/sitou/src/TreasureMap.java @@ -2,33 +2,46 @@ package src; public class TreasureMap { final int height; - private final int width; + final int width; final char[][] world; + final boolean[][] visited; public TreasureMap(InputData inputData) { height = inputData.height; width = inputData.width; world = new char[getHeight()][getWidth()]; + visited = new boolean[getHeight()][getWidth()]; - - //scanした文字列を分解して1文字1マスで扱えるようにする - for(int i = 0; i < getHeight(); i++) { + // scanした文字列を分解して1文字1マスで扱えるようにする + for (int i = 0; i < getHeight(); i++) { String text = inputData.mapStatus[i]; - for(int j = 0; j < getWidth(); j++) { + for (int j = 0; j < getWidth(); j++) { getWorld()[i][j] = text.charAt(j); } } } - + + public void mark(final int x, final int y) { + visited[x][y] = true; + } + + public void erase(final int x, final int y) { + visited[x][y] = false; + } + public final int getHeight() { return height; } - + public int getWidth() { return width; } - + public final char[][] getWorld() { return world; } + + public final boolean[][] getVisited() { + return visited; + } } -- GitLab From 8dad2e92dd54900964e2977d16dd9a6d23c27c7d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BC=8A=E8=97=A4=20=E8=81=96=E5=A4=9C?= Date: Tue, 13 Aug 2024 16:31:30 +0900 Subject: [PATCH 4/5] =?UTF-8?q?treasureMap.get(0,0)=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sitou/src/A083_SecretMessage.java | 1 + sitou/src/TreasureMap.java | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/sitou/src/A083_SecretMessage.java b/sitou/src/A083_SecretMessage.java index 5d93b58..7419321 100644 --- a/sitou/src/A083_SecretMessage.java +++ b/sitou/src/A083_SecretMessage.java @@ -33,6 +33,7 @@ public class A083_SecretMessage { } public static Result solve(TreasureMap treasureMap) { + treasureMap.get(0,0); List allPaths = new ArrayList<>(); findPaths(0, 0, "", treasureMap, allPaths); diff --git a/sitou/src/TreasureMap.java b/sitou/src/TreasureMap.java index ccf2571..e8d2fea 100644 --- a/sitou/src/TreasureMap.java +++ b/sitou/src/TreasureMap.java @@ -44,4 +44,9 @@ public class TreasureMap { public final boolean[][] getVisited() { return visited; } + + public final char get(int x, int y) { + return world[x][y]; + + } } -- GitLab From 6d257a3920aa4d0a7277f2d551982d6fd39808f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BC=8A=E8=97=A4=20=E8=81=96=E5=A4=9C?= Date: Tue, 13 Aug 2024 16:48:19 +0900 Subject: [PATCH 5/5] =?UTF-8?q?isVisited=E3=83=A1=E3=82=BD=E3=83=83?= =?UTF-8?q?=E3=83=89=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sitou/src/A083_SecretMessage.java | 26 +++++++++++++------------- sitou/src/TreasureMap.java | 8 ++++---- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/sitou/src/A083_SecretMessage.java b/sitou/src/A083_SecretMessage.java index 7419321..460844d 100644 --- a/sitou/src/A083_SecretMessage.java +++ b/sitou/src/A083_SecretMessage.java @@ -33,7 +33,7 @@ public class A083_SecretMessage { } public static Result solve(TreasureMap treasureMap) { - treasureMap.get(0,0); + treasureMap.get(0, 0); List allPaths = new ArrayList<>(); findPaths(0, 0, "", treasureMap, allPaths); @@ -48,25 +48,25 @@ public class A083_SecretMessage { return new Result(smallestPath); } - - public enum Direction{ + + public enum Direction { UP(0, -1), - DOWN(0,1), - LEFT(-1,0), - RIGHT(1,0); - + DOWN(0, 1), + LEFT(-1, 0), + RIGHT(1, 0); + private final int x; private final int y; - + private Direction(final int x, final int y) { this.x = x; this.y = y; } - + public final int getX() { return x; } - + public final int getY() { return y; } @@ -77,7 +77,7 @@ public class A083_SecretMessage { // Map外や二度目に通る所のとき if (x < 0 || y < 0 || x >= treasureMap.getHeight() || y >= treasureMap.getWidth() - || treasureMap.visited[x][y]) { + || treasureMap.isVisited(x, y)) { return; } @@ -90,8 +90,8 @@ public class A083_SecretMessage { treasureMap.mark(x, y); path += treasureMap.getWorld()[x][y]; - - for(Direction direction : Direction.values()) { + + for (Direction direction : Direction.values()) { findPaths(x + direction.getX(), y + direction.getY(), path, treasureMap, allPaths); } diff --git a/sitou/src/TreasureMap.java b/sitou/src/TreasureMap.java index e8d2fea..0e1fef0 100644 --- a/sitou/src/TreasureMap.java +++ b/sitou/src/TreasureMap.java @@ -41,12 +41,12 @@ public class TreasureMap { return world; } - public final boolean[][] getVisited() { - return visited; + public final boolean isVisited(final int x, final int y) { + return visited[x][y]; } - public final char get(int x, int y) { + public final char get(final int x, final int y) { return world[x][y]; - + } } -- GitLab