zoukankan      html  css  js  c++  java
  • [PAT] A1091 Acute Stroke

    题目大意

    给定一个三维空间,0表示正常1表示有肿瘤,肿瘤块的大小大于等于t才算作是肿瘤。计算所有满足肿瘤块的大小之和。
    题目链接

    思路

    用三维数组存储。BFS广度优先搜索。注意细节。

    AC代码

    #define _CRT_SECURE_NO_WARNINGS
    #include<iostream>
    #include<queue>
    #include<vector>
    using namespace std;
    struct node {
    	int ii, jj, kk;
    };
    int G[61][1300][130];
    int index[6][3] = { {0,0,1},{0,0,-1},{0,1,0},{0,-1,0},{1,0,0},{-1,0,0} };
    bool vis[61][1300][130] = { false };
    int M, N, L, T, volume = 0;
    int BFS(node s) {
    	int ans = 1;
    	queue<node>q;
    	q.push(s);
    	vis[s.ii][s.jj][s.kk] = true;//注意只要push就标记vis!!!
    	while (!q.empty()) {
    		node t = q.front();
    		for (int i = 0; i < 6; i++) {
    			int z = t.ii + index[i][0], x = t.jj + index[i][1], y = t.kk + index[i][2];
    			if (z < 0 || z >= L || x < 0 || x >= M || y < 0 || y >= N);//注意边界判断!!!
    			else if (vis[z][x][y]==false && G[z][x][y]) {
    				ans++;
    				q.push({ z,x,y });
    				vis[z][x][y] = true;
    			}
    		}
    		q.pop();
    	}
    	return ans;
    }
    void Trave() {
    	int i, j, k;
    	for (i = 0; i < L; i++)
    		for (j = 0; j < M; j++)
    			for (k = 0; k < N; k++) {
    				if (vis[i][j][k] == false && G[i][j][k] == 1) {
    					int tv = BFS({ i,j,k });
    					if (tv >= T)volume += tv;
    				}
    			}
    }
    int main() {
    	int i, j, k;
    	scanf("%d%d%d%d", &M, &N, &L, &T);
    	for (i = 0; i < L; i++)
    		for (j = 0; j < M; j++)
    			for (k = 0; k < N; k++)
    				scanf("%d", &G[i][j][k]);
    	Trave();
    	printf("%d", volume);
    	return 0;
    }
    
  • 相关阅读:
    回溯算法
    cannot import name 'np' in mxnet
    Linux后台运行任务 nohup &
    为Windows Terminal添加右键菜单
    Outlook设置QQ邮箱
    逻辑回归 logistic regression
    Python添加自定义目录到sys.path
    强化学习 策略梯度
    为Windows terminal preview添加右键菜单
    双系统使用Linux引导
  • 原文地址:https://www.cnblogs.com/yue36/p/13597177.html
Copyright © 2011-2022 走看看