您的位置:首页 > 其它

CCCC-GPLT l3-004. 肿瘤诊断 搜索

2018-03-29 19:05 190 查看
在三维01立方体中搜索连通块,将不小于t的连通块计入总数,输出总数.

简单的搜索题.

非常需要注意的是x,y,z的顺序!

读入数据是按z,x,y给的,如果代码中全部写x,y,z其实也无所谓,只要保存值与最大值一致就行,千万不要一会xyz一会zxy.

由上边引申的一个问题:数组大小,三个维度是不一样的.

使用了emplace,可以提升一些效率,但是需要写一个构造函数.

关于编写代码的方式:

相同运行效率的情况下,最重要的应该是编码效率和可读性(方便调试),而不是秀操作,警示自己.

/* LittleFall : Hello! */
#include <bits/stdc++.h>
#define ll long long
using namespace std;
inline int read();
inline void write(int x);
int save[65][1300][130];
const int go[6][3]={{1,0,0},{-1,0,0},{0,1,0},{0,-1,0},{0,0,1},{0,0,-1}};
struct Point
{
int z, x, y;
Point(int z, int x, int y): z(z), x(x), y(y) {}
};

int main(void)
{
#ifdef _LITTLEFALL_
freopen("in.txt", "r", stdin);
#endif
//std::cin.sync_with_stdio(false);

int n = read(), m = read(), l = read(), t = read(), ans = 0;
for(int i=1;i<=l;++i)for(int j=1;j<=n;++j)for(int k=1;k<=m;++k)
save[i][j][k] = read();

queue<Point> q;
for(int i=1;i<=l;++i)for(int j=1;j<=n;++j)for(int k=1;k<=m;++k)
{
if(save[i][j][k])
{
while(!q.empty())   q.pop();
int tmp = 1;
save[i][j][k] = 0;
q.emplace(i, j, k);
while(!q.empty())
{
Point zxy = q.front();
q.pop();
int z = zxy.z, x = zxy.x, y = zxy.y;
for(int dir=0;dir<6;++dir)
{
int nz=z+go[dir][0],nx=x+go[dir][1],ny=y+go[dir][2];
if(nz>=1&&nz<=l&&nx>=1&&nx<=n&&ny>=1&&ny<=m&&save[nz][nx][ny])
{
tmp++;
save[nz][nx][ny]=0;
q.emplace(nz,nx,ny);
}
}
}
if(tmp >= t) ans += tmp;
}
}
printf("%d\n",ans );
return 0;
}

inline int read()
{
int x = 0, f = 1;
char ch = getchar();
while(ch < '0' || ch > '9')
{
if(ch == '-')f = -1;
ch = getchar();
}
while(ch >= '0' && ch <= '9')
{
x = x * 10 + ch - '0';
ch = getchar();
}
return x * f;
}
inline void write(int x)
{
if(x < 0) putchar('-'), x = -x;
if(x > 9) write(x / 10);
putchar(x % 10 + '0');
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: