日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

PAT甲题题解-1091. Acute Stroke (30)-BFS

發(fā)布時(shí)間:2025/3/15 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 PAT甲题题解-1091. Acute Stroke (30)-BFS 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

題意:給定三維數(shù)組,0表示正常,1表示有腫瘤塊,腫瘤塊的區(qū)域>=t才算是腫瘤,求所有腫瘤塊的體積和

這道題一開(kāi)始就想到了dfs或者bfs,但當(dāng)時(shí)看數(shù)據(jù)量挺大的,以為會(huì)導(dǎo)致棧溢出,所以并沒(méi)有立刻寫(xiě),想有沒(méi)有別的辦法。
然而結(jié)果是,實(shí)在想不出別的辦法了,所以還是嘗試寫(xiě)寫(xiě)dfs、bfs。

一開(kāi)始先用了dfs,最后兩個(gè)樣例段錯(cuò)誤,估計(jì)是棧溢出了。
之所以dfs棧溢出,因?yàn)閐fs的時(shí)候每個(gè)狀態(tài)都會(huì)存儲(chǔ)在堆棧里,就好比dfs的第一個(gè)狀態(tài),一直保存到最后整個(gè)dfs結(jié)束。
而bfs是存儲(chǔ)在隊(duì)列中,每次隊(duì)列都會(huì)有狀態(tài)取出來(lái),所以棧存儲(chǔ)就會(huì)少很多。

對(duì)于每次bfs,計(jì)算腫瘤塊體積,如果>=t,才算入總和sum中。
用vis[i][j][k]標(biāo)記結(jié)點(diǎn)是否被訪問(wèn)過(guò),被訪問(wèn)過(guò)的就不會(huì)再次訪問(wèn),即不會(huì)再加入到隊(duì)列中去。

PS:這里slice和vis數(shù)組開(kāi)成了62*1288*130,即每個(gè)維度都比原來(lái)多2,是為了處理數(shù)組越界

#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]; //標(biāo)記對(duì)應(yīng)的點(diǎn)是否訪問(wèn)過(guò) 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++;//六個(gè)方向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

?

轉(zhuǎn)載于:https://www.cnblogs.com/chenxiwenruo/p/6786453.html

總結(jié)

以上是生活随笔為你收集整理的PAT甲题题解-1091. Acute Stroke (30)-BFS的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。