PTA甲级考试真题练习91——1091 Acute Stroke

题目

在这里插入图片描述

思路

三维变量的广度优先遍历(多连通分量),题意太难理解了 ,原本以为是对每个点的六个方向计数,如果大于阈值就sum+1,结果是判断整个连通分量的数量是否大于阈值,如果大于就加上连通分量的数量。

代码

#include <iostream>
#include<queue>
using namespace std;
const int nmax = 100005;
const int xmax = 1300;
const int ymax = 130;
const int zmax = 65;

int m, n, l, t;
int sum = 0;
int graph[zmax][xmax][ymax];
int visited[zmax][xmax][ymax];
typedef struct
{
	int x, y, z;
}pos;

int BFS(pos p) {
	queue<pos> q;
	q.push(p);
	int cnt = 0;
	while (!q.empty()) {
		pos tmp = q.front();
		q.pop();
		cnt++;
		//向六个方向探索:
		if (tmp.z > 0 && graph[tmp.z - 1][tmp.x][tmp.y]) {
			if (!visited[tmp.z - 1][tmp.x][tmp.y]) {
				visited[tmp.z - 1][tmp.x][tmp.y] = 1;
				q.push(pos{ tmp.x,tmp.y,tmp.z - 1 });
			}	
		}
		if (tmp.z < l - 1 && graph[tmp.z + 1][tmp.x][tmp.y]) { 
			if (!visited[tmp.z + 1][tmp.x][tmp.y]) {
				visited[tmp.z + 1][tmp.x][tmp.y] = 1;
				q.push(pos{ tmp.x,tmp.y,tmp.z + 1 });
			}
		}
		if (tmp.x > 0 && graph[tmp.z][tmp.x-1][tmp.y]) {
			if (!visited[tmp.z][tmp.x - 1][tmp.y]) {
				visited[tmp.z][tmp.x - 1][tmp.y] = 1;
				q.push(pos{ tmp.x - 1,tmp.y,tmp.z });
			}
		}
		if (tmp.x <m- 1 && graph[tmp.z][tmp.x+1][tmp.y]) { 
			if (!visited[tmp.z][tmp.x + 1][tmp.y]) {
				visited[tmp.z][tmp.x + 1][tmp.y] = 1;
				q.push(pos{ tmp.x + 1,tmp.y,tmp.z });
			}
		}
		if (tmp.y > 0 && graph[tmp.z][tmp.x][tmp.y - 1]) {
			if (!visited[tmp.z][tmp.x][tmp.y - 1]) {
				visited[tmp.z][tmp.x][tmp.y - 1] =1;
				q.push(pos{ tmp.x,tmp.y - 1,tmp.z });
			}
		}
		if (tmp.y< n - 1 && graph[tmp.z][tmp.x][tmp.y+1]) {
			if (!visited[tmp.z][tmp.x][tmp.y + 1]) {
				visited[tmp.z][tmp.x][tmp.y + 1] = 1;
				q.push(pos{ tmp.x,tmp.y + 1,tmp.z });
			}
		}
	}
	if (cnt >= t)
		return cnt;
	else
		return 0;
}
int main()
{
	cin >> m >> n >> l >> t;
	for (int i = 0; i < l; ++i) 
		for (int j = 0; j < m; ++j) 
			for (int k = 0; k < n; ++k) 
				cin >> graph[i][j][k];
	memset(visited, 0, sizeof(visited));
	for (int i = 0; i < l; ++i)
		for (int j = 0; j < m; ++j)
			for (int k = 0; k < n; ++k) {
				if (!visited[i][j][k] && graph[i][j][k]) {
					visited[i][j][k] = 1;
					sum += BFS(pos{j,k,i});
				}
			}
	cout << sum;
	return 0;
}
发布了153 篇原创文章 · 获赞 4 · 访问量 3799

猜你喜欢

转载自blog.csdn.net/qq_43647628/article/details/105407262