1091 Acute Stroke (30 分)

广度优先搜索(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);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值