什么是网站黏着度,数字营销是什么,企业网站建设公司网络服务,无锡信息网招聘题意#xff1a;给定三维数组#xff0c;0表示正常#xff0c;1表示有肿瘤块#xff0c;肿瘤块的区域t才算是肿瘤#xff0c;求所有肿瘤块的体积和 这道题一开始就想到了dfs或者bfs#xff0c;但当时看数据量挺大的#xff0c;以为会导致栈溢出#xff0c;所以并没… 题意给定三维数组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 cnt0;
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 res0;queueNodeq;t.ia;t.jb;t.kc;q.push(t);vis[a][b][c]true;while(!q.empty()){tq.front();q.pop();it.i;jt.j;kt.k;if(i0 || il || j0 || jm || k0 || kn)continue;res;//六个方向if(slice[i][j-1][k] !vis[i][j-1][k]){t.ii;t.jj-1;t.kk;q.push(t);vis[i][j-1][k]true;}if(slice[i][j1][k] !vis[i][j1][k]){t.ii;t.jj1;t.kk;q.push(t);vis[i][j1][k]true;}if(slice[i][j][k-1] !vis[i][j][k-1]){t.ii;t.jj;t.kk-1;q.push(t);vis[i][j][k-1]true;}if(slice[i][j][k1] !vis[i][j][k1]){t.ii;t.jj;t.kk1;q.push(t);vis[i][j][k1]true;}if(slice[i1][j][k] !vis[i1][j][k]){t.ii1;t.jj;t.kk;q.push(t);vis[i1][j][k]true;}if(slice[i-1][j][k] !vis[i-1][j][k]){t.ii-1;t.jj;t.kk;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 i1;il;i){for(int j1;jm;j){for(int k1;kn;k){scanf(%d,a);if(a1)slice[i][j][k]true;elseslice[i][j][k]false;}}}int sum0;for(int i1;il;i){for(int j1;jm;j){for(int k1;kn;k){cntBFS(i,j,k);if(cntt)sumcnt;}}}printf(%d\n,sum);return 0;
} View Code 转载于:https://www.cnblogs.com/chenxiwenruo/p/6786453.html