Marathon Match 43に久しぶりに取り組み中
ここしばらく TopCoderをやってなかったのですが3連休で久しぶりに時間があるので、MM43に挑戦してみようと思います。
問題はこちら:http://www.topcoder.com/longcontest/?module=ViewProblemStatement&compid=8999&rd=13568
画像を使った認証システムがあり、限定された情報しかない状態でログインできるかどうかを競うものです。とりあえず、visualization tool 用のコードをJavaで書いてみました。これを元にアルゴリズムを考えてみます。
import java.util.ArrayList; import java.util.List; import java.util.Random; import java.util.Scanner; public class GraphicalAuthentication { private final Random random_ = new Random(); private int k_; private int m_; private int sz_; private String[] loginInfo_; public int shoulderSurfing(int K, int M, int SZ) { k_ = K; m_ = M; sz_ = SZ; loginInfo_ = Spy.successfulLogin(); return 0; } public int[] loginAttempt(String[] screen) { return new int[] {random_.nextInt(screen[0].length()), random_.nextInt(screen.length)}; } public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int k = Integer.parseInt(scanner.nextLine()); int m = Integer.parseInt(scanner.nextLine()); int sz = Integer.parseInt(scanner.nextLine()); Spy.SZ = sz; GraphicalAuthentication ga = new GraphicalAuthentication(); ga.shoulderSurfing(k, m, sz); System.out.println("0"); while (true) { String[] screen = new String[10 * sz]; for (int index = 0; index < screen.length; index++) { screen[index] = scanner.nextLine(); } int[] res = ga.loginAttempt(screen); System.out.println(res[0]); System.out.println(res[1]); } } } class Spy { public static int SZ; public static String[] successfulLogin() { System.out.println("1"); Scanner scanner = new Scanner(System.in); List<String> list = new ArrayList<String>(); for (int index = 0; index < 10 * SZ + 2; index++) { list.add(scanner.nextLine()); } return list.toArray(new String[0]); } }