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;
    }
    
  • 相关阅读:
    swift init继承问题
    CocoaPods 使用本地代码
    关于Xcode6 Segue 的疑问,没有解决!
    Cocos2d 学习资料推荐
    iOS8中 UILocalNotification 和 UIRemoteNotification 使用注意
    Cocos2d 初学基本知识
    iOS 和 Android 触摸事件传递
    iOS NSOperation的使用
    Android 相机对焦模式
    AES 推荐文章
  • 原文地址:https://www.cnblogs.com/yuhan-blog/p/12308632.html
Copyright © 2011-2022 走看看