- bfsってやるだけなんだけど、これまで汎用化していなかった
- たたき台としてここに書いておく
verified
- E - チーズ (Cheese)
- D - Grid Repainting
- C - 幅優先探索
- G-グリッド金移動
code
VS S;
const int H_MAX = 55;
ll d[H_MAX][H_MAX];
ll H,W;
int dx[4] = {-1, 0, 1, 0};
int dy[4] = { 0, 1, 0, -1};
bool in_range(ll i, ll j){
if(0<=i && i<H && 0<=j && j<W){
return true;
}else{
return false;
}
}
const char block = '#';
const char pass = '.';
ll bfs(PII from, PII to){
rep(i,H_MAX){
rep(j,H_MAX){
d[i][j]=-1;
}
}
queue<PII> que;
d[from.first][from.second] = 0;
que.push(from);
while(!que.empty()){
auto pa = que.front(); que.pop();
rep(i, 4){
ll ny = pa.first + dy[i];
ll nx = pa.second + dx[i];
if(in_range(ny,nx) && d[ny][nx]==-1 && S[ny][nx]!=block){
d[ny][nx] = d[pa.first][pa.second] + 1;
que.push(MP(ny,nx));
}
}
}
return d[to.first][to.second];
}
aを見つけたらbに塗るbfs
auto fill_edge = [&](PII start, ll search, ll paint){
if(G[start.first][start.second]!=search)return;
queue<PII> que;
que.push(start);
G[start.first][start.second]=paint;
while(!que.empty()){
auto pa = que.front(); que.pop();
ll y = pa.first;
ll x = pa.second;
rep(i,4){
ll ny = y + dy[i];
ll nx = x + dx[i];
if(!in_range(ny,nx))continue;
if(G[ny][nx]==search){
que.push({ny,nx});
G[ny][nx]=paint;
}
}
}
};