プログラマメモ2 - programmer no memo2

poj 2386 水溜まり。 2011/08/28

Javaです。

勉強がてらチャレンジ。探索問題 深さ優先探索(DFS:Depth-First Search)の問題らしい。遷移できなくなるまで調べる。再帰にマッチするらしい。
package p2386; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int n = scanner.nextInt(); int m = scanner.nextInt(); char[][] cs = new char[n][m]; scanner.skip("\n"); for (int i = 0; i < n; i++) { // char[] cs2 = new char[m]; cs[i] = scanner.nextLine().toCharArray(); } System.out.println(solve(cs)); } /** * 解く * * @param cs * @return */ public static int solve(char[][] cs) { int c = 0; for (int y = 0; y < cs.length; y++) { for (int x = 0; x < cs[y].length; x++) { if (cs[y][x] == 'W') { dfs(cs, x, y); c++; } } } return c; } /** * * @param cs * @param x * @param y */ static void dfs(char[][] cs, int x, int y) { // 検査済み cs[y][x] = '.'; /* * 8方向調べる。水溜まりならそこから調べる。 */ for (int dx = -1; dx <= 1; dx++) { for (int dy = -1; dy <= 1; dy++) { int nx = x + dx; int ny = y + dy; if (0 <= nx && nx < cs[y].length && 0 <= ny && ny < cs.length && cs[ny][nx] == 'W') { dfs(cs, nx, ny); } } } } }

poj 1065 Wooden Sticks 2011/08/28

Javaです。POJです。 1065 -- Wooden Sticks
これも自力でないです。
いろいろ参考にしましたが、よく理解できてないです。
PKU 1065 Wooden Sticks - 敗戦記
 

package p1065_not_completed; import java.io.IOException; import java.util.Scanner; public class Main { static boolean debug = false; static class Pair { int w; int l; boolean use = false; public Pair(int l, int w) { this.w = w; this.l = l; } public String toString() { return "l:[" + l + "] w:[" + w + "] use:[" + use + "]"; } } public static void main(String[] args) throws IOException { Scanner scanner = new Scanner(System.in); int t = scanner.nextInt(); for (int i = 0; i < t; i++) { int setupTime = 0; int n = scanner.nextInt(); Pair[] pairs = new Pair[n]; for (int j = 0; j < n; j++) { int l = scanner.nextInt(); int w = scanner.nextInt(); Pair pair = new Pair(l, w); pairs[j] = pair; } sort(pairs); print(pairs); setupTime = count(pairs); System.out.println(setupTime); } } static void print(Pair[] pairs) { if (!debug) return; for (Pair pair : pairs) { System.err.println(pair); } System.err.println(); } static void sort(Pair[] pairs) { for (int i = 0; i < pairs.length; i++) { print(pairs); for (int k = i + 1; k < pairs.length; k++) { if (pairs[i].l < pairs[k].l) { Pair pair = pairs[i]; pairs[i] = pairs[k]; pairs[k] = pair; } } } } static int count(Pair[] pairs) { int c = 0; for (int i = 0; i < pairs.length; i++) { Pair p1 = pairs[i]; if (p1.use) continue; for (int j = i + 1; j < pairs.length; j++) { Pair p2 = pairs[j]; if (p2.use) continue; if ((p2.l <= p1.l && p2.w <= p1.w)) { p2.use = true; p1 = p2; } } c++; } return c; } }

poj 1852 蟻 2011/08/27

POJです。Javaです。 1852 -- Ants ずばり蟻ですね。
で、自力で解けてないです。。。
下記の本を参考にしてます。 この本で勉強していこうかと。
プログラミングコンテストチャレンジブック 秋葉 拓哉 岩田 陽一 北川 宜稔 4839931992

package p1852; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int t = scanner.nextInt(); while(0 < t--){ int L = scanner.nextInt(); int n = scanner.nextInt(); int[] as = new int[n]; for (int i = 0; i < n; i++) { as[i] = scanner.nextInt(); } solve(L, n, as); } } static void solve(int L, int n, int[] as){ int minT = 0; for (int i = 0; i < n; i++) { minT = Math.max(minT, Math.min(as[i], L- as[i])); } int maxT = 0; for (int i = 0; i < n; i++) { maxT = Math.max(maxT, Math.max(as[i], L- as[i])); } System.out.printf("%d %d%n", minT, maxT); } }

poj 1028 - Web Navigation 2011/08/21
2011/08/21

1028 -- Web Navigation Javaにはデフォルトでstackがあるから楽。 といっても、いまどきのプログラミング言語にはついてるのだろうけど。 まったくむずかしいことはなく素直に、問題文を指示通りにコードにするだけ。

package p1028; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.Stack; public class Main { public static void main(String[] args) throws IOException { BufferedReader reader = new BufferedReader(new InputStreamReader( System.in)); String line; Stack forwardStack = new Stack(); Stack backwardStack = new Stack(); String currentPage = "http://www.acm.org/"; while ((line = reader.readLine()) != null) { String[] ss = line.split(" "); if ("BACK".equals(ss[0])) { if (backwardStack.isEmpty()) { p(null); continue; } forwardStack.push(currentPage); currentPage = backwardStack.pop(); } else if ("FORWARD".equals(ss[0])) { if (forwardStack.isEmpty()) { p(null); continue; } backwardStack.push(currentPage); currentPage = forwardStack.pop(); } else if ("VISIT".equals(ss[0])) { backwardStack.push(currentPage); forwardStack.removeAllElements(); currentPage = ss[1]; } else if ("QUIT".equals(ss[0])) { break; } p(currentPage); } } static void p(String s) { System.out.println(s == null ? "Ignored" : s); } }