PKU 2212 Cavern
http://poj.org/problem?id=2212
3次元の洞窟に上から水を吸い出す。
水がある座標が与えられるので、てっぺんから辿れる全ての水を吸い出すといくら吸い出せるかを答えろというような問題。
ただの幅優先。最初appとvisをset
なんでこんなに解いている人が少ないのか謎です。
bool app[100][100][100]; bool vis[100][100][100]; void solve(){ int x,y,z; cin>>x>>y>>z; memset(app,0,sizeof(app)); memset(vis,0,sizeof(vis)); queue<pair<int,PI> > q; rep(i,z){ int p; cin>>p; rep(j,p){ int x,y; cin>>x>>y; --x,--y; app[x][y][i]=true; if(!i) q.push(mp(i,mp(x,y))); } } int ans=0; int dx[]={1,-1,0,0,0,0},dy[]={0,0,1,-1,0,0},dz[]={0,0,0,0,1,-1}; while(!q.empty()){ int cz=q.front().F; int cx=q.front().S.F; int cy=q.front().S.S; q.pop(); if(vis[cx][cy][cz]) continue; vis[cx][cy][cz]=true; ++ans; rep(i,6){ int nx=cx+dx[i],ny=cy+dy[i],nz=cz+dz[i]; if(min(nx,min(ny,nz))<0 || nx>=x || ny>=y || nz>=z) continue; if(!app[nx][ny][nz]) continue; q.push(mp(nz,mp(nx,ny))); } } printf("Je nutne vycerpat %d litru vody.\n",ans*1000); } main(){ ios::sync_with_stdio(false); int t; cin>>t; rep(i,t) solve(); }