PTA—L3-004 肿瘤诊断
直达链接点我!!!
思路
- …三维的搜索…就考你理不理解搜索了…
- 其他的还要注意的就是别用自己写的队列(就是一个很大的数组),这样会段错误…,用queue吧,不超时…
AC代码
#include <iostream>
#include <queue>
using namespace std;
int a[65][1400][130];
int book[65][1400][130];
int n,m,l,t;
int dir[6][3] = {{0,1,0},{0,0,1},{0,-1,0},{0,0,-1},{1,0,0},{-1,0,0}};
int bfs(int z,int x,int y)
{
queue<int> que[3];
int sum = 1;
que[0].push(z);
que[1].push(x);
que[2].push(y);
book[z][x][y] = 1;
while(!que[0].empty())
{
int q = que[0].front(),u = que[1].front(),v = que[2].front();
que[0].pop(),que[1].pop(),que[2].pop();
for(int i=0;i<6;i++)
{
int z1,x1,y1;
z1 = q+dir[i][0];
x1 = u+dir[i][1];
y1 = v+dir[i][2];
if(z1 >= 0 && z1 < l && x1 >= 0 && x1 < m && y1 >= 0 && y1 < n && !book[z1][x1][y1] && a[z1][x1][y1] == 1)
{
book[z1][x1][y1] = 1;
que[0].push(z1);
que[1].push(x1);
que[2].push(y1);
sum ++;
}
}
}
if(sum >= t)
return sum;
else
return 0;
}
int main()
{
scanf("%d %d %d %d",&m,&n,&l,&t);
int i,j,k;
int all = 0;
int hman = 0;
for(i=0;i<l;i++)
for(j=0;j<m;j++)
for(k=0;k<n;k++)
scanf("%d",&a[i][j][k]);
for(i=0;i<l;i++)
for(j=0;j<m;j++)
for(k=0;k<n;k++)
{
if(book[i][j][k] == 0 && a[i][j][k] == 1)
{
all += bfs(i,j,k);
}
}
printf("%d\n",all);
return 0;
}