一、技术总结
- 这一题是BFS广度优先搜索算法,感觉这类题目是首先定义需要的数据结构类型,然后会定义一个数组用于存放数据,还有一个bool类型的数组看是否已经放入队列中了。然后再编写一个判断函数judge()排除数组中超出范围的数字返回false,还有就是不满足条件或者是已经在队列中的,最后就返回true。
- 同时也应该定义一个广度扩散的二维或三维数组。
- 编写BFS函数,首先定义需要的变量,然后定义一个队列终于记录,把传入的参数赋给数据结构,然后push进入队列中,然后再编写while循环,只要队列不空,就一直,这里也要定义一个队首参数,用于每次取队列首部元素,然后再写一个for循环广度搜索,判断是否符合要求,如果符合要求push进入队列中,该元素设置为true。
二、参考代码
#include<cstdio>
#include<queue>
using namespace std;
struct Node{
int x, y, z;
}node;
int X[6] = {0, 0, 0, 0, 1, -1};
int Y[6] = {0, 0, 1, -1, 0, 0};
int Z[6] = {1, -1, 0, 0, 0, 0};
int matrix[1290][130][61];
bool inq[1290][130][61] = {false};
int n, m, slice, T;//记录矩阵大小和层数,T是最少的数量?
bool test(int x, int y, int z){
if(x >= n || x < 0 || y >= m || y <0 || z >= slice || z < 0) return false;
if(matrix[x][y][z] == 0 || inq[x][y][z] == true) return false;
return true;
}
int BFS(int x, int y, int z){
int tot = 0;
queue<Node> q;
node.x = x, node.y = y, node.z = z;
q.push(node);
inq[x][y][z] = true;
while(!q.empty()){
Node top = q.front();
q.pop();
tot++;
for(int i = 0; i < 6; i++){
int newx = top.x + X[i];
int newy = top.y + Y[i];
int newz = top.z + Z[i];
if(test(newx, newy, newz)){
node.x = newx, node.y = newy, node.z = newz;
q.push(node);
inq[newx][newy][newz] = true;
}
}
}
if(tot >= T) return tot;
else return 0;
}
int main(){
scanf("%d%d%d%d", &n, &m, &slice, &T);
for(int i = 0; i < slice; i++){
for(int j = 0; j < n; j++){
for(int k = 0; k < m; k++){
scanf("%d", &matrix[j][k][i]);
}
}
}
int ans = 0;
for(int i = 0; i < slice; i++){
for(int j = 0; j < n; j++){
for(int k = 0; k < m; k++){
if(matrix[j][k][i] == 1 && inq[j][k][i] == false){
ans += BFS(j, k, i);
}
}
}
}
printf("%d\n", ans);
return 0;
}
原文地址:https://www.cnblogs.com/tsruixi/p/12275000.html
时间: 2024-11-05 20:48:34