广度优先搜索(BFS)问题,其中此题多了一个统计功能;
坑点如下
1,坐标的存储方式,采用结构体数组存储
struct Node{
int x,y,z;
}node;
2,遍历方式,预先设计数组
int X[6]={1,-1,0,0,0,0};
int Y[6]={0,0,1,-1,0,0};
int Z[6]={0,0,0,0,1,-1};
3,关于判断,设置bool型inq数组判断该点是否已经入队,设置test函数判断该点是否需要入队,判断条件(该点在界限内&&该点还未入队)
4,BFS的大体模板(统计个数)
首先定义结构体队列q,将x,y,z存入结构体中并入列,inq设置已入列之后为while(!q.emty())循环,再循环中将q中的元素一一列举,每列举一次pop一次,之后对列举的每一个搜索其周边合理元素放入队列。
int BFS(int x,int y,int z){
int number=1;
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();
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)==true){
number++;
node.x=newX,node.y=newY,node.z=newZ;
q.push(node);
inq[newX][newY][newZ]=true;
}
}
}
if(number>=t)
{ return number;}
else return 0;
}
5,主函数中的处理
for(int i=0;i<l;i++){
for(int k=0;k<m;k++){
for(int l=0;l<n;l++){
if(maxl[i][k][l]==1&&inq[i][k][l]==false)
{
sum=sum+BFS(i,k,l);
}
}
}
列举法,判断条件,当前数字为1&&当期数字点未入过列,
整体代码如下
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<queue>
using namespace std;
int maxl[65][1250][130];
bool inq[65][1250][130];
int m,n,l,t;
int sum=0;
struct Node{
int x,y,z;
}node;
int X[6]={1,-1,0,0,0,0};
int Y[6]={0,0,1,-1,0,0};
int Z[6]={0,0,0,0,1,-1};
bool test(int x,int y,int z){
if(x>=0&&x<=l-1&&y>=0&&y<=m-1&&z>=0&&z<=n-1&&inq[x][y][z]==false&&maxl[x][y][z]==1)
{ return true;}
else
{return false;}
}
int BFS(int x,int y,int z){
int number=1;
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();
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)==true){
number++;
node.x=newX,node.y=newY,node.z=newZ;
q.push(node);
inq[newX][newY][newZ]=true;
}
}
}
if(number>=t)
{ return number;}
else return 0;
}
int main(){
scanf("%d%d%d%d",&m,&n,&l,&t);
for(int i=0;i<l;i++)
{
for(int k=0;k<m;k++)
{for (int l=0;l<n;l++){
scanf("%d",&maxl[i][k][l]);
}
}
}
for(int i=0;i<l;i++){
for(int k=0;k<m;k++){
for(int l=0;l<n;l++){
if(maxl[i][k][l]==1&&inq[i][k][l]==false)
{
sum=sum+BFS(i,k,l);
}
}
}
}
printf("%d",sum);
}