PAT甲级1091 【Acute Stroke】 (30)

4 篇文章 0 订阅

分析:三维BFS,相当于每个面进行叠放,一个面和上面的面以及下面的面相邻,注意三维数组定义的时候大范围的维定义在前面,否则最后两个点超时。。很迷

#include<iostream>
#include<cstdio>
#include<queue>
using namespace std;
typedef struct Node{
	int x, y, z;
}Node;
int arr[1300][130][63], vis[1300][130][63];
int m, n, l, t, res;
int dirz[] = {-1, 1, 0, 0, 0, 0};
int dirx[] = {0, 0, -1, 0, 1, 0};
int diry[] = {0, 0, 0, -1, 0, 1};
int bfs(int x, int y, int z){
	int block = 0;
	Node node;
	node.x = x;
	node.y = y;
	node.z = z;
	queue<Node> q;
	q.push(node);
	vis[x][y][z] = 1;
	while(!q.empty()){
		Node cur = q.front();
		q.pop();
		block++;
		for(int i = 0; i<6; i++){
			int nowx = cur.x + dirx[i];
			int nowy = cur.y + diry[i];
			int nowz = cur.z + dirz[i];
			if(nowx < 0 || nowx >= m || nowy < 0 || nowy >= n || 
				nowz < 0 || nowz >= l || vis[nowx][nowy][nowz] || !arr[nowx][nowy][nowz]) continue;
			vis[nowx][nowy][nowz] = 1;
			node.x = nowx; node.y = nowy; node.z = nowz;
			q.push(node);
		}
	}
	return block >= t ? block : 0;
}
int main(){
	//freopen("in.txt", "r", stdin);
	ios::sync_with_stdio(false);
	int i, j, k;
	cin >> m >> n >> l >> t;
	for(k = 0; k<l; k++){
		for(i = 0; i<m; i++)
			for(j = 0; j<n; j++)
				cin >> arr[i][j][k];
	}
	for(k = 0; k<l; k++){
		for(i = 0; i<m; i++){
			for(j = 0; j<n; j++)
				if(arr[i][j][k] && !vis[i][j][k])
					res += bfs(i, j, k);
		}
	}
	cout << res << endl;
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值