SRM326 div2 hard
水面の高さを1ずつ上げていってBFSすると簡単に書けた
#include <queue> #include <vector> #include <string> using namespace std; class PoolFiller { public: int BFS(vector<string> pool) { int h=pool.size(),w=pool[0].size(); int r=0; int mv[4][2]={{0,-1},{0,1},{-1,0},{1,0}}; for(int sy=0;sy<h;sy++) for(int sx=0;sx<w;sx++) if(pool[sy][sx]=='.') { int extent=0; bool isSurrounded=true; queue<int> que; que.push(sy*100+sx); while(!que.empty()) { int y=que.front()/100,x=que.front()%100; que.pop(); if(y<0 || h<=y || x<0 || w<=x) { isSurrounded=false; continue; } if(pool[y][x]=='#') continue; pool[y][x]='#'; extent++; for(int i=0;i<4;i++) { int yy=y+mv[i][0],xx=x+mv[i][1]; que.push(yy*100+xx); } } if(isSurrounded) r+=extent; } return r; } int getCapacity(vector<string> layout) { int ans=0; int h=layout.size(),w=layout[0].size(); for(char water='2';water<='9';water++) { vector<string> pool(h,string(w,'#')); for(int i=0;i<h;i++) for(int j=0;j<w;j++) if(layout[i][j] < water) pool[i][j]='.'; ans+=BFS(pool); } return ans; } };