PAT A1091 Acute Stroke (BFS搜索地图)

这次练习我学到了一些东西

  1. breath first search算法的实现
  2. 增量数组对地图的前后左右上下进行访问
  3. 读取文件
    //FILE* stream;
    //freopen_s(&stream,“input.txt”, “r”, stdin);
  4. c++可以建立3维以上的数组
#include <iostream>
#include <string>
#include <set>
#include <map>
#include<queue>
#include<stack>
#include<algorithm>

//new and delete
//A1091 Acute Stroke
using namespace std;

const int MaxL = 70;
const int MaxM = 1290;
const int MaxN = 130;
//数据矩阵
int data1[MaxL][MaxM][MaxN];
//记录(x,y,z)是否已访问
bool inq[MaxL][MaxM][MaxN] = { false };
//增量数组
int X[] = { 0,0,1,-1,0,0 };
int Y[] = { 1,-1,0,0,0,0 };
int Z[] = { 0,0,0,0,1,-1 };
//L张照片,M*N像素,T是阈值
int M, N, L, T;

struct Node {
	int x;
	int y;
	int z;
};

void PrintM(int M, int N, int L) {
	for (int i = 0; i < L; i++) {
		for (int j = 0; j < M; j++) {
			for (int k = 0; k < N; k++) {
				cout<< data1[i][j][k]<<" ";
			}
			cout << "\n";
		}
		cout << "\n";
	}
}

//判断data1[z][x][y]是否需要入队
bool judge(Node n) {
	int x, y, z;
	z = n.z;
	x = n.x;
	y = n.y;
	if (z >= L || x >= M || y >= N || z<0 || x<0 || y<0 \
		|| inq[z][x][y] == true || data1[z][x][y] == 0)
		return false;
	else
		return true;

}
//BFS,返回该块volume,若为0则返回0
int BFS(int z, int x, int y) {
	int volume=0;	//该块volume
	Node n;
	n.x = x;
	n.y = y;
	n.z = z;
	queue<Node> q;
	q.push(n);
	inq[z][x][y] = true;

	while (!q.empty()) {
		//访问队首元素
		Node n1 = q.front();
		volume++;
		q.pop();

		//把n1后继结点入队
		Node temp;
		for (int i = 0; i < 6; i++) {
			temp.z = n1.z+Z[i];
			temp.x = n1.x+X[i];
			temp.y = n1.y+Y[i];
			if (judge(temp)) {
				q.push(temp);
				inq[temp.z][temp.x][temp.y] = true;
			}
		}
	}
	if (volume >= T)
		return volume;
	else
		return 0;
}

int main() {
	//FILE* stream;
	//freopen_s(&stream,"input.txt", "r", stdin);

	
	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 >> data1[i][j][k];
			}
		}
	}
	
	//搜索算法计算,i是层数,x*y是照片
	int volume = 0;
	for (int i = 0; i < L; i++) {	
		for (int j = 0; j < M; j++) {
			for (int k = 0; k < N; k++) {
				int temp_vol=0;
				//如果未访问过且相应为1
				if (inq[i][j][k] == false && data1[i][j][k] == 1) {
					temp_vol = BFS(i, j, k);
					volume += temp_vol;
					//cout << temp_vol << endl;
				}
			}
		}
	}

	cout << volume << endl;

	return 0;

}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值