GoogleCodeJam2009 Qualification Round
Tags: CodeJam
2009/09/05 23:20
予選。
夜中しか無理だったので、睡魔との戦い。
A. Alien Language
考えようではただの正規表現。
(Hashでいけるかと組んでみたけど、smallすら無理だった)
public AlienLanguage() throws FileNotFoundException{
FileInputStream fis = new FileInputStream("src/qualification_round/A-large.in");
Scanner sc = new Scanner(fis);
int L = sc.nextInt();
int D = sc.nextInt();
int N = sc.nextInt();
char[][] d = new char[D][L];
// dic
for (int i = 0; i < D; i++) {
d[i] = sc.next().toCharArray();
}
char[][] t = new char[L][];
// test case
for (int i = 0; i < N; i++) {
String s = sc.next();
int p = 0;
for (int j = 0; j < s.length(); j++, p++) {
char c = s.charAt(j);
if (c == '(') {
int b = j;
while (c != ')') {
c = s.charAt(++j);
}
t[p] = s.substring(b + 1, j).toCharArray();
Arrays.sort(t[p]);
} else {
t[p] = new char[]{c};
}
}
int count = 0;
for (int j = 0; j < D; j++) {
for (int k = 0; k < L; k++) {
if (Arrays.binarySearch(t[k], d[j][k]) < 0) {
break;
}
if (k == L - 1) {
count++;
}
}
}
System.out.println("Case #" + (i + 1) + ": " + count);
}
}
B. Watersheds
問題文の翻訳に苦戦。名詞よくわかんない。
コード自体は素直に左上から順に流していく感じ。
Point[] p = new Point[]{new Point(-1, 0), new Point(0, -1), new Point(0, 1), new Point(1, 0)};
int[][] map;
char[][] result;
char label;
public Watersheds() throws FileNotFoundException {
FileInputStream fis = new FileInputStream("src/qualification_round/B-large.in");
Scanner sc = new Scanner(fis);
int M = sc.nextInt();
for (int i = 0; i < M; i++) {
int H = sc.nextInt();
int W = sc.nextInt();
// init
map = new int[H + 2][W + 2];
Arrays.fill(map[0], 10000);
Arrays.fill(map[H + 1], 10000);
for (int j = 0; j < H + 2; j++) {
map[j][0] = 10000;
map[j][W + 1] = 10000;
}
// build map
for (int j = 1; j < H + 1; j++) {
for (int k = 1; k < W + 1; k++) {
map[j][k] = sc.nextInt();
}
}
// flow
result = new char[H + 2][W + 2];
result[1][1] = label = 'a';
flow(1, 1, (char)0, new LinkedList<Point>());
for (int j = 1; j < H + 1; j++) {
for (int k = 1; k < W + 1; k++) {
if (result[j][k] < 'a') flow(j, k, (char)0, new LinkedList<Point>());
}
}
// output
System.out.println("Case #" + (i + 1) + ":");
for (int j = 1; j < H + 1; j++) {
for (int k = 1; k < W + 1; k++) {
if (k != 1) System.out.print(" ");
System.out.print(result[j][k]);
}
System.out.println();
}
}
}
public void flow(int h, int w, char l, LinkedList<Point> list){
list.add(new Point(h, w));
// has label?
if (result[h][w] >= 'a') {
l = result[h][w];
}
// has next?
int min = map[h][w];
int d = -1;
for (int i = 0; i < 4; i++) {
if (min > map[h + p[i].x][w + p[i].y]) {
min = map[h + p[i].x][w + p[i].y];
d = i;
}
}
if (d >= 0) {
// flow
flow(h + p[d].x, w + p[d].y, l, list);
} else {
// bain
if (l < 'a') l = ++label;
for (Iterator<Point> iterator = list.iterator(); iterator.hasNext();) {
Point point = iterator.next();
result[point.x][point.y] = l;
}
}
}
C. Welcome to Code Jam
意味はわかりやすかったけど、眠気に負けて寝落ち。
DP嫌いだったという理由もあったとかなかったとか(笑
起きてスコアみてみたら、全然苦労した記憶ないのに、B解くのに2時間くらいかかってた。
次は時間制限あるし、いい時間にやれるといいなあ。
とりあえず66pで次にはあがれそうなので、Tシャツ目指して頑張ります。
