pat 甲級 1091(bfs)
阿新 • • 發佈:2018-11-18
題目連結:https://pintia.cn/problem-sets/994805342720868352/problems/994805375457411072
思路:給出一個腦子的體積,0表示正常細胞,1表示中風細胞,求中風細胞的總體積
,如果連續的中風細胞的體積超過v,就記為中風細胞。
其實就是找一個連續的1細胞的體積,如果體積大於v就算,小於v就不算。用bfs就好了,開始我好傻,
還去用dfs。
#include<iostream> #include<cstdio> #include<cstring> #include<queue> using namespace std; const int maxn1 = 60; const int maxn2 = 130; const int maxn3 = 1300; int vis[maxn3][maxn2][maxn1],a[maxn3][maxn2][maxn1],n,m,k; int xx[6]={0,0,1,0,0,-1}; int yy[6]={0,1,0,0,-1,0}; int zz[6]={1,0,0,-1,0,0}; struct Node{ int x,y,z; }; int bfs(int x,int y,int z) { int i,j,ans=0; queue <Node> q; Node tmp,tp; tmp.x=x;tmp.y=y;tmp.z=z; q.push(tmp); while(!q.empty()) { tmp=q.front(); q.pop(); ans++; for(i=0;i<6;i++) { tp.x=tmp.x+xx[i]; tp.y=tmp.y+yy[i]; tp.z=tmp.z+zz[i]; if(tp.x<1||tp.y<1||tp.z<1||tp.x>n||tp.y>m||tp.z>k) continue; if(vis[tp.x][tp.y][tp.z]==0&&a[tp.x][tp.y][tp.z]==1) { vis[tp.x][tp.y][tp.z]=1; q.push(tp); } } } return ans; } int main(void) { int i,j,q,l,v; scanf("%d%d%d%d",&m,&n,&k,&v); for(q=1;q<=k;q++) for(j=1;j<=m;j++) for(i=1;i<=n;i++) scanf("%d",&a[i][j][q]); int ans=0; memset(vis,0,sizeof(vis)); for(q=1;q<=k;q++) for(j=1;j<=m;j++) for(i=1;i<=n;i++) { if(vis[i][j][q]==0&&a[i][j][q]==1) { vis[i][j][q]=1; int tp=bfs(i,j,q); if(tp>=v) ans+=tp; } } printf("%d\n",ans); return 0; }