第四个点RE(虽然开大数组过了但是还是很好奇为什么会RE)

P1162 填涂颜色

lunatics @ 2022-07-26 00:36:51

AC代码如下,问题发生在队列的定义,最开始我使用的是int queue[900][2],然后代码除了第四个点RE其余全AC。后来把数组长度开到100000,就过了。

目前随便测了几次,队列开到70000也是RE。但是理论上最多只有900个点,并且一定达不到900,队列开900就够了,为什么会出现RE的情况?求大佬赐教。

#include<stdio.h>

int queue[100000][2], matrix[40][40];
int dx[4] = { 1,0,-1,0 }, dy[4] = { 0,-1,0,1 };

void BFS(int x, int y) {
    int head = 0, tail = 1;
    queue[head][0] = x; queue[head][1] = y;
    while (head != tail) {
        for (int i = 0; i < 4; i++) {
            if (matrix[queue[head][0] + dx[i]][queue[head][1] + dy[i]] == 0) {
                queue[tail][0] = queue[head][0] + dx[i];
                queue[tail][1] = queue[head][1] + dy[i];
                tail++;
            }
        }
        matrix[queue[head][0]][queue[head][1]] = 100;
        head++;
    }
}

int main(void) {
    int n;
    scanf("%d", &n);
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= n; j++) {
            scanf("%d", &matrix[i][j]);
        }
    }
    for (int i = 0; i <= n + 1; i++) {
        matrix[i][0] = 100;
        matrix[i][n + 1] = 100;
        matrix[0][i] = 100;
        matrix[n + 1][i] = 100;
    }
    for (int i = 1; i <= n; i++) {
        if (matrix[i][1] == 0) {
            BFS(i, 1);
        }
        if (matrix[i][n] == 0) {
            BFS(i, n);
        }
        if (matrix[1][i] == 0) {
            BFS(1, i);
        }
        if (matrix[n][i] == 0) {
            BFS(n, i);
        }
    }
    for (int i = 1; i <= n; i++){
        for (int j = 1; j <= n; j++){
            if (matrix[i][j] == 0)
                matrix[i][j] = 2;
            if (matrix[i][j] == 100)
                matrix[i][j] = 0;
        }
    }
    for (int i = 1; i < n; i++) {
        for (int j = 1; j <= n; j++) {
            printf("%d ", matrix[i][j]);
        }
        printf("\n");
    }
    for (int j = 1; j < n; j++) {
        printf("%d ", matrix[n][j]);
    }
    printf("%d", matrix[n][n]);
}

by Powerful_25 @ 2022-07-26 08:23:03

@lunatics

可能因为你在每次元素出队时并没有真正删除元素,而是把队头位置往后移动,所以如果算上之前加入然后又删除的元素,得出的结果很可能大于900(也就是说你会RE)。


by so_find_skind @ 2022-07-26 08:41:08

@sherry0218 我冒昧的问一下:那大于70000是几个意思?


by Powerful_25 @ 2022-07-26 08:46:26

@lunatics

推荐一种方法:

头文件:

#include<queue>

定义:

queue<int> q;

PS:此处q为队列名

插入元素:

q.push(x);

PS:此处q为队列名,x为待插入元素

删除元素:

q.pop();

PS:此处q为队列名,且无返回结果

访问队头元素:

a=q.front();

PS:此处q为队列名,因返回结果为一个值(即队头元素的值),则需把这个值赋给一个变量,此处即为变量a

查询队中元素个数:

a=q.size();

PS:此处q为队列名,因返回结果为一个值(即队中元素个数),则需把这个值赋给一个变量,此处即为变量a

查询队列是否为空:

if(q.empty()==true)

PS:此处q为队列名,且返回结果为true/false(即1/0),此语句多用于判断(即if语句)

by Powerful_25 @ 2022-07-26 08:58:31

@W_YH

可能还是不够大吧,我刚刚试了一下,发现开到76000就够了

记录


by lunatics @ 2022-07-27 03:18:49

@sherry0218

谢谢大佬。我大概知道是什么原因了,应该是因为大部分点重复入队导致队长过长,再加个标记判断应该就能解决了。


|