这次练习我学到了一些东西
- breath first search算法的实现
- 增量数组对地图的前后左右上下进行访问
- 读取文件
//FILE* stream;
//freopen_s(&stream,“input.txt”, “r”, stdin); - 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;
}