团体程序设计天梯赛 L3-004 肿瘤诊断 (30分)(DFS)
题目链接:
L3-004 肿瘤诊断 (30分)
思路:
此题题意很简单,就是求连通的像素个数;
我们DFS即可,每次查询它的上下左右前后,如果符合条件就继续DFS;
可是有一个问题,此题DFS层数过多会爆栈,解决方法就是改成BFS;
什么?这么顺眼的DFS题你让我用BFS?我才不干( ̄^ ̄)
那么如何使用DFS来AC此题呢?
1.首先我们需要手动加栈,PTA的编译器是G++,因此我们可以使用下面这种方式手动扩栈:
extern void run(void) __asm__ ("run");
void run() {
//...
exit(0);
}
int main() {
int __size__ = 64 << 20; //扩充64MB
char *__p__ = (char *)malloc(__size__) + __size__;
__asm__ __volatile__("movq %0, %%rsp\n pushq $exit\n jmp run\n" :: "r"(__p__));
run();
return 0;
}
2.改完之后会发现倒数第二个测试点还是爆栈,此时已经不能再扩栈了,因为会超内存;
此时我们观察递归函数会发现主要是重复创建变量会导致内存占用过多,那我们将函数的参数都改为引用即可~
代码:
#include<bits/stdc++.h>
using namespace std;
bool a[61][1287][129];
short m, n, l, f[1300];
int t;
#define ok(x, y, z) (x >= 0 && y >= 0 && z >= 0 && a[x][y][z])
int dfs(const short & x, const short & y, const short & z) {
a[x][y][z] = 0;
int res = 1;
if(ok(x - 1, y, z)) res += dfs(f[x - 1], y, z);
if(ok(x + 1, y, z)) res += dfs(f[x + 1], y, z);
if(ok(x, y - 1, z)) res += dfs(x, f[y - 1], z);
if(ok(x, y + 1, z)) res += dfs(x, f[y + 1], z);
if(ok(x, y, z - 1)) res += dfs(x, y, f[z - 1]);
if(ok(x, y, z + 1)) res += dfs(x, y, f[z + 1]);
return res;
}
#define REP for(int i = 0; i < l; ++i) for(int j = 0; j < m; ++j) for(int k = 0; k < n; ++k)
extern void run(void) __asm__ ("run");
void run() {
ios::sync_with_stdio(false);
cin.tie(0);
for(short i = 0; i < 1300; ++i) f[i] = i;
cin >> m >> n >> l >> t;
REP cin >> a[i][j][k];
int ans = 0;
REP if(ok(i, j, k)) {
int res = dfs(i, j, k);
if(res >= t) ans += res;
}
cout << ans;
exit(0);
}
int main() {
int __size__ = 64 << 20;
char *__p__ = (char *)malloc(__size__) + __size__;
__asm__ __volatile__("movq %0, %%rsp\n pushq $exit\n jmp run\n" :: "r"(__p__));
run();
return 0;
}