L3-004 腫瘤診斷(天梯賽)
阿新 • • 發佈:2022-04-20
天梯賽就是喜歡搞些複雜的dfs和bfs
這題就是一道三維的bfs
#include<iostream> #include<queue> using namespace std; struct Node { int a,b,c; Node(int a1,int b1,int c1):a(a1),b(b1),c(c1){}; }; const int maxa=1286+5,maxb=128+5,maxc=60+5; int G[maxa][maxb][maxc]; int vis[maxa][maxb][maxc]; int M,N,L,T; int pa[6]={1,-1,0,0,0,0},pb[6]={0,0,1,-1,0,0},pc[6]={0,0,0,0,1,-1}; bool isedgeok(int a,int b,int c) { if(a<M&&a>=0&&b<N&&b>=0&&c<L&&c>=0) return true; return false; } int bfs(int a,int b,int c) { if(!G[a][b][c]||vis[a][b][c]) return 0; int cnt=1; vis[a][b][c]=1; queue<Node> qu; qu.push(Node(a,b,c));//bug 1 while(!qu.empty()) { auto tmp=qu.front(); qu.pop(); a=tmp.a,b=tmp.b,c=tmp.c; for(int i=0;i<6;++i) { int tmpa=a+pa[i],tmpb=b+pb[i],tmpc=c+pc[i]; if(isedgeok(tmpa,tmpb,tmpc)&&!vis[tmpa][tmpb][tmpc]&&G[tmpa][tmpb][tmpc])//bug 0 { cnt++; qu.push(Node(tmpa,tmpb,tmpc)); vis[tmpa][tmpb][tmpc]=1; } } } if(cnt>=T) return cnt; return 0; } int main() { cin>>M>>N>>L>>T; for(int i=0;i<L;++i) for(int j=0;j<M;++j) for(int k=0;k<N;++k) cin>>G[j][k][i]; int sum=0; for(int i=0;i<L;++i) for(int j=0;j<M;++j) for(int k=0;k<N;++k) sum+=bfs(j,k,i); cout<<sum; }