読者です 読者をやめる 読者になる 読者になる

Problem 2206 : Compile

404 Not Found

簡単な実装問題なんだけど、39分掛かった。そろそろ大会だということで、問題を解くにしても時間を気にして解いている。

  1. とりあえず提出でWA、原因分からない(26分)→
  2. 5分後くらいにお邪魔ブロック消しのルールの解釈を間違っていたことに気づいて修正。(31分)
  3. 変なバグ(テスト入力データの書式がバグってた)に悩まされる。
  4. 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();
		}
	}
}