intさわだんのBlack History

刹那的レジェンドになりたい。

ICPC 国内予選2014B 連鎖消滅パズル AOJ1193

こういうただ実装するだけの問題あまり好きではない。
vectorをつかってステップごとに要素の番号が+5されるようにした(vectorの途中の要素を消すのが無限にバグりそうだったため

#include <bits/stdc++.h>
#define chmin(a, b) ((a)=min((a), (b)))
#define chmax(a, b) ((a)=max((a), (b)))
#define fs first
#define sc second
#define eb emplace_back
using namespace std;
 
typedef long long ll;
typedef pair<int, int> P;
typedef tuple<int, int, int> T;
 
const ll MOD=1e9+7;
const ll INF=1e18;
 
int dx[]={1, -1, 0, 0};
int dy[]={0, 0, 1, -1};


bool ch[7][15];
int flag,ans;
int mini[6];
int fil[7][7] = {
    {0,1,1,1,1,1},
    {0,1,1,1,1,0},
    {0,0,1,1,1,1},
    {0,1,1,1,0,0},
    {0,0,1,1,1,0},
    {0,0,0,1,1,1},
};
int fil2[] = {5,4,4,3,3,3};

int main(){
    int h;
    while(true){
        cin >> h;
        if(h == 0) break;
        vector<int> v[500];
        for(int i = 0;i < h;i++){
            for(int j = 1;j <= 5;j++){
                int tmp;
                cin >> tmp;
                v[j].insert(v[j].begin(), tmp);
            }
        }

        ans = 0;
        for(int num = 0;true;num++){
            int tmpans = ans;
            for(int i = 0;i <= h;i++){
                for(int j = 1;j <= 5;j++){
                    ch[j][i] = false;
                }
            }
            for(int i = 0;i < 6;i++){
                mini[i] = v[num*5+3].size();
                for(int j = 1;j <= 5;j++){
                    if(fil[i][j] == 0)continue;
                    if(mini[i] > v[num*5+j].size()) mini[i] =v[num*5+j].size();
            //        mini[i] = min(mini[i],v[num*5+j].size());
                }
            }

            for(int i = 0;i < h;i++){
                for(int k = 0;k < 6;k++){
                    if(i > mini[k]-1) continue;
                    int same = v[num*5+3][i];
                    int flag = 1;
                    for(int j = 1;j <= 5;j++){
                        if(fil[k][j] == 0)continue;
                        if(same != v[num*5+j][i]){
                            flag = 0;
                            break;
                        }
                    }
                    if(flag == 1){
                        ans += same*fil2[k];
                        for(int j = 1;j <= 5;j++){
                            if(fil[k][j] == 1)ch[j][i] = true;
                        }
                        break;
                    }
                }
            }
            for(int i = 1;i <= 5;i++){
                for(int j = 0;j < v[num*5+i].size();j++){
                    if(ch[i][j] == false) v[num*5+5+i].push_back(v[num*5+i][j]);
                }
            }
            if(tmpans == ans)break;
        }
        cout << ans << endl;

    }

}