1091. Acute Stroke (30)

13 篇文章 0 订阅

pat题目链接
牛客网题目链接
题目大意:计算连通域的大小,给出一个三维矩阵,先给出一个平面的矩阵依次向上叠加。计算其连通点大于阈值的个数。
代码:

#include <iostream>
#include<stdio.h>
#include<limits.h>
#include<queue>
using namespace std;
int width,heigh;
int num,threhold;
int regions[61][1287][129];///num width heigh
int biaoji[61][1287][129];
int upDown[6]={1,-1,0,0,0,0};
int leftRight[6]={0,0,-1,1,0,0};
int frontRear[6]={0,0,0,0,1,-1};
int sum=0;
void  digui(int k,int i,int j,int &sum)
{
    ///超时
    if(k>=0&&k<num&&i>=0&&i<width&&j>=0&&j<heigh)///在范围之内
    {


        if(biaoji[k][i][j]==-1)///已经被访问过
            return ;
        biaoji[k][i][j]=-1;
        if(regions[k][i][j]==1)
        {
            sum++;
            ///次数在十万数量级
            for(int kk=0;kk<6;kk++)
            {

                digui(k+upDown[kk],i+frontRear[kk],j+leftRight[kk],sum);
                ///超时
            }
            /// 一个段错误 一个运行超时
        }
    }
}
void notdigui(int k,int i,int j,int &sum)
{
    queue<int> que;
    if(biaoji[k][i][j]==-1)///没有被访问过
        return ;
    que.push(k);
    que.push(i);
    que.push(j);
    while(!que.empty())
    {
            k=que.front();
            que.pop();
            i=que.front();
            que.pop();
            j=que.front();
            que.pop();
         for(int kk=0;kk<6;kk++)
            {
                if(k+upDown[kk]>=0&&k+upDown[kk]<num&&i+frontRear[kk]>=0&&i+frontRear[kk]<width&&j+leftRight[kk]>=0&&j+leftRight[kk]<heigh)
                  if(biaoji[k+upDown[kk]][i+frontRear[kk]][j+leftRight[kk]]!=-1)
                  {

                     biaoji[k+upDown[kk]][i+frontRear[kk]][j+leftRight[kk]]=-1;
                    if( regions[k+upDown[kk]][i+frontRear[kk]][j+leftRight[kk]]==1)///
                    {
                        sum++;
                        que.push(k+upDown[kk]);
                        que.push(i+frontRear[kk]);
                        que.push(j+leftRight[kk]);
                    }
                }
            }
            ///出队


    }

}
int main()
{

    scanf("%d%d%d%d",&width,&heigh,&num,&threhold);///m 1286 n 128 l 60 t
    for(int k=0;k<num;k++)
        for (int i=0;i<width;i++)
            for(int j=0;j<heigh;j++)
                {
                    scanf("%d",&regions[k][i][j]);
                }
   ///超时
    for(int k=0;k<num;k++)
        for (int i=0;i<width;i++)
            for(int j=0;j<heigh;j++)
                {
                    int temp=0;
                    notdigui(k,i,j,temp);
                  ///段错误
                    if(temp>=threhold)
                        sum+=temp;

                }
   ///段错误
    cout<<sum;
    return 0;
}

使用digui(int k,int i,int j,int &sum)这个函数,在牛客网上可以通过,但是在pat上回有两组案例出现段错误。原因是pat未通过的数据数量级是十万,所以应该是系统堆栈溢出,所以改写成非递归(上述代码notdigui(int k,int i,int j,int &sum)函数),使用宽度优先搜索。案例通过。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值