簡単な実装問題なんだけど、39分掛かった。そろそろ大会だということで、問題を解くにしても時間を気にして解いている。
- とりあえず提出でWA、原因分からない(26分)→
- 5分後くらいにお邪魔ブロック消しのルールの解釈を間違っていたことに気づいて修正。(31分)
- 変なバグ(テスト入力データの書式がバグってた)に悩まされる。
- AC(39分)
本番ではこういうくだらないミスをしてはいけない・・・。
#include <iostream> #include <vector> #include <cstring> using namespace std; #define rep(i,n) for(int i=0;i<n;i++) string data[12]; /* 方向用変数 */ int dx[] = {1,-1,0,0}; int dy[] = {0,0,-1,1}; /* 判定関数 */ bool iscorrect(int y,int x){ if(y>11 || y<0)return false; if(x<0 || x>5)return false; return true; } bool ispuyo(int i,int j){ return data[i][j] != 'O' && data[i][j] != '.'; } /* 個数を数える */ int chainCount; bool done[12][6]; void search(int y,int x,int c){ if(data[y][x] != c)return; if(done[y][x])return; chainCount++; done[y][x] = true; rep(i,4){ int nx = x+dx[i]; int ny = y+dy[i]; if(iscorrect(ny,nx))search(ny,nx,c); } } /* 削除する */ void del(int y,int x,int c){ if(data[y][x] != c)return; data[y][x] = '.'; rep(i,4){ int nx = x+dx[i]; int ny = y+dy[i]; if(iscorrect(ny,nx)){ if(data[ny][nx]=='O') data[ny][nx]='.'; //隣接していたらついでに消す del(ny,nx,c); } } } /* 落下させる */ void down(){ rep(x,12){ rep(w,6){ rep(i,12-1){ if(data[i+1][w] == '.'){ swap(data[i+1][w],data[i][w]); } } } } } int main(){ int n; cin >>n; while(n--){ rep(i,12)cin >> data[i]; down(); for(int retCount = 0;;retCount++){ bool flag = true; rep(i,12)rep(j,6){ if( ispuyo(i,j)){ memset(done,0,12*6), chainCount = 0, search(i,j,data[i][j]); if(chainCount >= 4){ del(i,j,data[i][j]); flag = false; } } } if(flag){ cout << retCount << endl; break; } down(); } } }