PKU 1164-The Castle
解法
BFS.
壁があるというのを座標系を2倍することで上手く表現出来るようになる?
実装(C++)
#include <iostream> #include <queue> #include <algorithm> using namespace std; int MAP[102][102]; int H,W,roomcount,roommax; #define REP(i,x)for(int i=0;i<(int)x;i++) int dx[4]={2,0,-2,0},dy[4]={0,2,0,-2}; int BFS(int x,int y){ typedef pair<int,int> P; queue<P> que; que.push(P(x,y)); MAP[x][y]=2; int ans=1; while(!que.empty()){ P t=que.front();que.pop(); x=t.first,y=t.second; for(int i=0;i<4;i++){ int nx=x+dx[i],ny=y+dy[i]; if(nx>=0&&nx<W*2&&ny>=0&&ny<H*2){ int mx=(nx+x)/2; int my=(ny+y)/2; if(MAP[mx][my]==0&&MAP[nx][ny]==0){ MAP[nx][ny]=2; ans++; que.push(P(nx,ny)); } } } } return ans; } int main() { cin>>H>>W; REP(y,H){ REP(x,W){ int t; cin>>t; int tx=x*2+1,ty=y*2+1; if(t&1){ MAP[tx-1][ty]=1; } if(t&2){ MAP[tx][ty-1]=1; } if(t&4){ MAP[tx+1][ty]=1; } if(t&8){ MAP[tx][ty+1]=1; } } } REP(y,H){ REP(x,W){ if(MAP[x*2+1][y*2+1]==0){ roomcount++; roommax=max(roommax,BFS(x*2+1,y*2+1)); } } } cout<<roomcount<<endl<<roommax<<endl; return 0; }