純ブログ

ちょっとプログラミングしてる人のブログです。

ACM-ICPC 2014 国内予選参加記

一昨日行われた ACM-ICPC 2014 国内予選に, KCCT-A2014 というチーム (自分 @nahcnuj, @akahana_1, @summation_hsp2) で参加しました.

自分は B 問題を解きました. 問題文を読んでやるだけっぽいと思ったので, すぐに実装をはじめましたが, 石の落下処理の実装に手間取りました. 入出力例が合うことを確認して, Data No.1 の出力を提出したところ Wrong Answer. 落ちるケースが分からないままコンテスト終了.

他のチームメンバが A 問題C 問題を解いていましたが正答できず... 結果, 一問も正答することができませんでした.

来年の ICPC に向けて競技プログラミングの勉強をしていこうと思います.


自分が書いた B 問題のソースコードを貼っておきます.

#include <iostream>
using namespace std;

int field[10][5] = {{0}};   // empty is 0
int H;

// スコア計算および消去処理 返却値はその処理で得られたスコア
int calc() {
    int score = 0;

    for (int i = 0; i < H; ++i) {
        int count = 1, before = field[i][0], start = 0;
        for (int j = 1; j < 5; ++j) {
            if (field[i][j] == 0) continue;

            if (before == field[i][j]) ++count;
            else if (count >= 3) { break; }
            else { count = 1; before = field[i][j]; start = j; }
        }
        if (count >= 3) {
            for (int j = start; j < start+count; ++j) {
                field[i][j] = 0;
            }
            score += before*count;
        }
    }

    for (int j = 0; j < 5; ++j) {
        int spcount = 0;
        for (int i = H-1; i >= 0; --i) {
            if (field[i][j] == 0) spcount++;
            else {
                if (spcount > 0) {
                    field[i+spcount][j] = field[i][j];
                    field[i][j] = 0;
                }
            }
        }
    }

    return score;
}

int main()
{
    while (cin >> H, H) {
        for (int i = 0; i < H; ++i) {
            for (int j = 0; j < 5; ++j) {
                cin >> field[i][j];
            }
        }
        int score = 0, before = 0;
        do {
            before = score;
            score += calc();
        } while (score-before > 0);
        cout << score << endl;
    }
    return 0;
}