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; } }