PAT甲题题解-1091. Acute Stroke (30)-BFS
生活随笔
收集整理的這篇文章主要介紹了
PAT甲题题解-1091. Acute Stroke (30)-BFS
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題意:給定三維數組,0表示正常,1表示有腫瘤塊,腫瘤塊的區域>=t才算是腫瘤,求所有腫瘤塊的體積和
這道題一開始就想到了dfs或者bfs,但當時看數據量挺大的,以為會導致棧溢出,所以并沒有立刻寫,想有沒有別的辦法。
然而結果是,實在想不出別的辦法了,所以還是嘗試寫寫dfs、bfs。
一開始先用了dfs,最后兩個樣例段錯誤,估計是棧溢出了。
之所以dfs棧溢出,因為dfs的時候每個狀態都會存儲在堆棧里,就好比dfs的第一個狀態,一直保存到最后整個dfs結束。
而bfs是存儲在隊列中,每次隊列都會有狀態取出來,所以棧存儲就會少很多。
對于每次bfs,計算腫瘤塊體積,如果>=t,才算入總和sum中。
用vis[i][j][k]標記結點是否被訪問過,被訪問過的就不會再次訪問,即不會再加入到隊列中去。
PS:這里slice和vis數組開成了62*1288*130,即每個維度都比原來多2,是為了處理數組越界
#include <iostream> #include <cstdio> #include <algorithm> #include <cstring> #include <queue> using namespace std; int m,n,l,t; bool slice[62][1288][130]; //即輸入 bool vis[62][1288][130]; //標記對應的點是否訪問過 int cnt=0; struct Node{int i,j,k; }; int BFS(int a,int b,int c){if(vis[a][b][c] || slice[a][b][c]==false)return 0;Node t;int i,j,k;int res=0;queue<Node>q;t.i=a;t.j=b;t.k=c;q.push(t);vis[a][b][c]=true;while(!q.empty()){t=q.front();q.pop();i=t.i;j=t.j;k=t.k;if(i==0 || i>l || j==0 || j>m || k==0 || k>n)continue;res++;//六個方向if(slice[i][j-1][k] && !vis[i][j-1][k]){t.i=i;t.j=j-1;t.k=k;q.push(t);vis[i][j-1][k]=true;}if(slice[i][j+1][k] && !vis[i][j+1][k]){t.i=i;t.j=j+1;t.k=k;q.push(t);vis[i][j+1][k]=true;}if(slice[i][j][k-1] && !vis[i][j][k-1]){t.i=i;t.j=j;t.k=k-1;q.push(t);vis[i][j][k-1]=true;}if(slice[i][j][k+1] && !vis[i][j][k+1]){t.i=i;t.j=j;t.k=k+1;q.push(t);vis[i][j][k+1]=true;}if(slice[i+1][j][k] && !vis[i+1][j][k]){t.i=i+1;t.j=j;t.k=k;q.push(t);vis[i+1][j][k]=true;}if(slice[i-1][j][k] && !vis[i-1][j][k]){t.i=i-1;t.j=j;t.k=k;q.push(t);vis[i-1][j][k]=true;}}return res; } int main() {memset(vis,false,sizeof(vis));memset(slice,false,sizeof(slice));int a;scanf("%d %d %d %d",&m,&n,&l,&t);for(int i=1;i<=l;i++){for(int j=1;j<=m;j++){for(int k=1;k<=n;k++){scanf("%d",&a);if(a==1)slice[i][j][k]=true;elseslice[i][j][k]=false;}}}int sum=0;for(int i=1;i<=l;i++){for(int j=1;j<=m;j++){for(int k=1;k<=n;k++){cnt=BFS(i,j,k);if(cnt>=t)sum+=cnt;}}}printf("%d\n",sum);return 0; } View Code?
轉載于:https://www.cnblogs.com/chenxiwenruo/p/6786453.html
總結
以上是生活随笔為你收集整理的PAT甲题题解-1091. Acute Stroke (30)-BFS的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Hive之import和export使用
- 下一篇: IIS网站或系统验证码不显示问题——使用