PAT甲级1091 【Acute Stroke】 (30)

分析:三维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;
}

猜你喜欢

转载自blog.csdn.net/gq__97/article/details/81364201
今日推荐