uav_Quadtrees(递归与分治)

题目不难,但有一个很大的意外的收获。

问题:当maxn定义为1024 + 10时,会run error,此时把s定义为全局变量时,AC。

结论:

这里1024 + 10本身定义小了,而由于其被定义为全局变量,恰巧对了。编译器下,即便越出了数组本身的界限,但没有非法访问,不会报错,没有任何问题。全局变量所在的堆空间比较大,较局部变量所在的栈域来说,更不易造成非法访问。

#include<bits/stdc++.h>
using namespace std;

const int len = 32;
const int maxn = 2048 + 30;
int buf[len][len];
int cnt;

//将s[p...]画到以(r,c)为左上角,宽度为w的画布上
void draw(const char* s, int& p, int r, int c, int w)
{
    char ch = s[p++];
    if(ch == 'p'){
        draw(s, p, r,       c + w/2, w/2); //右上
        draw(s, p, r,       c,       w/2); //左上
        draw(s, p, r + w/2, c,       w/2); //左下
        draw(s, p, r + w/2, c + w/2, w/2); //右下
    }else if(ch == 'f'){
        for(int i = r; i < r + w; i++){
            for(int j = c; j < c + w; j++){
                if(buf[i][j] == 0){
                    buf[i][j] = 1;
                    cnt++;
                }
            }
        }
    }
}

int main()
{
    int T;
    scanf("%d", &T);
    while(T--){
        char s[maxn];
        memset(buf, 0, sizeof(buf));
        cnt = 0;
        for(int i = 0; i < 2; i++){
            scanf("%s", s);
            int p = 0;
            draw(s, p, 0, 0, len);
        }
        printf("There are %d black pixels.\n", cnt);
    }
    return 0;
}

  

猜你喜欢

转载自www.cnblogs.com/sanshi-2018/p/10408112.html