TopCoder Marathon Match 34 用の起動関数
ちょっと前にTopCoder(http://www.topcoder.com/) に登録して、SRMの過去問題を解いたりしてたのですが、Marathon Match が始まったので参加してみました。問題はこちら http://www.topcoder.com/longcontest/?module=ViewProblemStatement&compid=7695&rd=12200 。ただ、ログインしていないと見れないようなので、興味があればregistしてみてください。簡単に言うと、昔あった土管を繋いで左側から右側へ水を流すゲームみたいな感じですが、既に配置されたパイプを回転させて繋いでいきます。動かす回数をいかに少なくうまく繋ぐかを競うようです。
前置きはそれくらいで、この問題用に動作結果をVisualで見れるToolが http://www.topcoder.com/contest/problem/CircuitConstruction/vis.html にて公開されています。使い方にそって動かせば、便利にテストができます。テスト時は、標準エラーに出力するとメッセージウィンドウで見れるのでそこを活用できます。
しかし、これを使うためにコンテストと関係ないコードが必要になります。その必要になる部分だけここで公開しちゃいます。Javaで参加される方は、良かったら使ってください。これって問題ないですよね???
import java.io.BufferedWriter; import java.io.FileWriter; import java.io.IOException; import java.util.Random; public class CircuitConstruction { private int w_; private int h_; int init(int W, int H, String C) { w_ = W; h_ = H; return 0; } int[] rotateSquare(int[] board) { // 適当実装 Random random = new Random(); return new int[] {random.nextInt(h_), random.nextInt(w_), random.nextBoolean()? 1: -1}; } private static int nextInt() throws IOException { return Integer.parseInt(readToken()); } private static String nextString() throws IOException { return readToken(); } private static String readToken() throws IOException { StringBuilder builder = new StringBuilder(); while (true) { int i = System.in.read(); if (i < 0) throw new IllegalStateException(); char c = (char) i; if (c <= ' ') { if (builder.length() == 0) continue; break; } builder.append(c); } return builder.toString(); } public static void main(String[] args) { // for visualization tool try { CircuitConstruction cc = new CircuitConstruction(); int W = nextInt(); int H = nextInt(); String C = nextString(); cc.init(W, H, C); while (true) { int[] board = new int[W * H]; for (int i = 0; i < W * H; i++) { board[i] = nextInt(); } int[] ret = cc.rotateSquare(board); System.out.println(ret[0] + " " + ret[1] + " " + ret[2]); System.out.flush(); } } catch (IOException e) { e.printStackTrace(); } } }