zoukankan      html  css  js  c++  java
  • 团体程序设计天梯赛 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
      pushq $exit
      jmp run
    " :: "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
      pushq $exit
      jmp run
    " :: "r"(__p__));
        run();
    	return 0;
    }
    
  • 相关阅读:
    PHP对URL传递的参数值进行编码和解码
    PHP 获取表单【2/2】
    PHP 获取表单【1/2】
    utf8 和 utf-8区别
    PHP 乘法口诀表
    PHP 插入和获取后台数据
    点击复制
    php网盘
    memcached-session-manager配置
    Apache Http Server与Tomcat6 的负载均衡(二)
  • 原文地址:https://www.cnblogs.com/yuhan-blog/p/12308632.html
Copyright © 2011-2022 走看看