PAT 甲级 1091 Acute Stroke
一开始只是简单的递归(bfs),导致最后两个没法通过(爆栈了)
//最后两个案例没有通过,只是最简单的bfs暴力算法
#include<cstdio>
using namespace std;
int v[62][1288][130]={0};
int find(int i,int j,int k){
int sum=1;
v[i][j][k]=2;
if(v[i][j][k+1]==1) sum+=find(i,j,k+1);
if(v[i][j][k-1]==1) sum+=find(i,j,k-1);
if(v[i][j+1][k]==1) sum+=find(i,j+1,k);
if(v[i][j-1][k]==1) sum+=find(i,j-1,k);
if(v[i+1][j][k]==1) sum+=find(i+1,j,k);
if(v[i-1][j][k]==1) sum+=find(i-1,j,k);
return sum;
}
int main(){
int m,n,l,t,ans=0,f;
scanf("%d %d %d %d",&m,&n,&l,&t);
// vector<vector<int>>v[l];
for(int i=1;i<=l;i++){
for(int j=1;j<=m;j++){
for(int k=1;k<=n;k++){
scanf("%d",&v[i][j][k]);
}
}
}
for(int i=1;i<=l;i++){
for(int j=1;j<=m;j++){
for(int k=1;k<=n;k++){
if(v[i][j][k]==1){
f=find(i,j,k);
ans+=f>=t? f:0;
}
}
}
}
printf("%d",ans);
return 0;
}
后面看了书上的使用queue存储走过的路径,就不用使用递归了。
//求有问题的总体积
//AC
#include<cstdio>
#include<queue>
using namespace std;
int v[62][1288][130]={0};
struct node{
int i,j,k;
};
queue <node> q;
int bfs(){
int num=0;
while(!q.empty()){
node a=q.front();
q.pop();
int i=a.i,j=a.j,k=a.k;
if(v[i][j][k]==2) continue;
num++;
v[i][j][k]=2;
if(v[i][j][k+1]==1) q.push({i,j,k+1});
if(v[i][j][k-1]==1) q.push({i,j,k-1});
if(v[i][j+1][k]==1) q.push({i,j+1,k});
if(v[i][j-1][k]==1) q.push({i,j-1,k});
if(v[i+1][j][k]==1) q.push({i+1,j,k});
if(v[i-1][j][k]==1) q.push({i-1,j,k});
}
return num;
}
int main(){
int m,n,l,t,ans=0,f;
scanf("%d %d %d %d",&m,&n,&l,&t);
for(int i=1;i<=l;i++){
for(int j=1;j<=m;j++){
for(int k=1;k<=n;k++){
scanf("%d",&v[i][j][k]);
}
}
}
for(int i=1;i<=l;i++){
for(int j=1;j<=m;j++){
for(int k=1;k<=n;k++){
if(v[i][j][k]==1){
q.push({i,j,k});
f=bfs();
ans+=f>=t? f:0;
}
}
}
}
printf("%d",ans);
return 0;
}