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",®ions[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)函数),使用宽度优先搜索。案例通过。